STL list容器 .size()返回数值错误

前两天写缓存代码时,遇见了一个我认为是STL的bug,如图所示,t2_clean是我定义的一个std::list对象,通过IDE我们可以看到此时该容器中有两个节点,分别对应的下标是0和1,此时我们调用.size()方法,理应获得的值是2,但这里获得的值是-1,通过多次调试,每次返回值是不同的,但总之是,.size()返回的值和容器中真实的节点个数不匹配。

通过一系列的Debug,找到了问题,其原因是splice函数,在我的项目代码中写了这样的一个语句,

t2.splice(t2.begin(), t2_clean, it2->list_ptr);

其中,t2和t2_clean一样也是std::list容器对象,splice函数的功能是将某个list对象(t2_clean)节点移动至另一个list对象(t2)的指定位置,其三个参数的意义分别是:

  1. 指向调用splice函数list对象中某个节点的迭代器(t2.begin()),将另一个对象插入到该迭代器前一个位置,在本语句中表示会将t2_clean对象的某个元素插入到t2的头节点前的一个位置。
  2. 和3 表示想要移动的list对象t2_clean)以及指向该对象某个元素的迭代器(it2->list_ptr)

splice函数如果遇见t2_clean是空的,此时继续执行splice函数会怎样?没错,该意外操作并不会报错,需要程序员自己控制该意外情况不发生,继续执行会导致t2的节点+1以及t2_clean的节点数目-1,但并不会真的有节点插入t2,此时对t2和t2_clean调用.size()方法会发现,t2的size比实际它所存储的节点数目多1,而t2_clean的size比实际它所存储的节点数目少1。


   转载规则


《STL list容器 .size()返回数值错误》 pglprome 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Android/Java 线程池笔记 Android/Java 线程池笔记
一、为何要使用线程池在Java中,要使用多线程,除了使用new Thread()之外,还可以使用线程池ExecutorService。 // 使用Thread Thread t = new Thread(new Runnable() {
2022-10-08
下一篇 
将CAJ文档转换成带书签的PDF 将CAJ文档转换成带书签的PDF
刚入门的科研工作者经常会阅读知网上的硕博论文,尤其是文科的童鞋们,理工科也可以从优秀的硕博中了解本行业的基础知识。但是知网的CAJ非常难用(就是LJ),pdf版本下载下来没有书签,故在此提供一个简单的方案,非常easy和快速,熟练的话也就一
2020-08-05
  目录