拼接列表后,迭代器存储了错误的值

Iterator stores the wrong value after splicing list

本文关键字:错误 存储 迭代器 列表 拼接      更新时间:2023-10-16

我有一些简单的代码。

#include <iostream>
#include <list>
std::list<int> A;
std::list<int> B;
std::list<int>::iterator location;
int main()
{
    A.push_back( 1 );
    location = A.begin();
    B.splice( B.end(), A, A.begin() );
    std::cout<< (*location) <<std::endl;
}

编译后,我得到运行时错误:List迭代器不可解引用。我该如何解决这个问题?

您正在使用的std::splice::list的重载使指向拼接元素的迭代器无效。从 23.2.2.4列表操作 [lib.list.ops] :

void splice(iterator position, list<T,Allocator>& x, iterator i);

Effects:在列表x的位置前插入一个i所指向的元素,并从x中删除该元素Position == I或Position == ++ I。只使迭代器和失效对拼接元素的引用。

(强调我的)

因此,在您的情况下,在拼接之前用A.begin()初始化的location变得无效。这种行为似乎在c++ 11中发生了变化,其中维护了迭代器的有效性(参见工作示例)。