拼接后的C ++ 11 std :: list迭代器失效

时间:2018-04-12 17:01:14

标签: c++ c++11 linked-list stl iterator

我试图理解在C ++ 11中的拼接操作之后std::list迭代器是如何受到影响的。这是一个不符合我预期的小例子:

std::list<int> A({1, 2, 3});
std::list<int> B;
auto p = A.begin(), q = A.end();
auto p_copy = p, q_copy = q;

// True:
std::cout << "p == A.begin()? " << (p == A.begin()) << std::endl;
// True:
std::cout << "p_copy == A.begin()? " << (p_copy == A.begin()) << std::endl;

B.splice(B.end(), A, p, q);

// True:
std::cout << "p == B.begin()? " << (p == B.begin()) << std::endl;
// False, but I don't understand why:
std::cout << "p_copy == A.begin()? " << (p_copy == A.begin()) << std::endl;
// True, but I don't understand why either:
std::cout << "p_copy == B.begin()? " << (p_copy == B.begin()) << std::endl;

在这个例子中,我不明白为什么p_copy迭代器在拼接后不再指向A.begin()

2 个答案:

答案 0 :(得分:3)

list迭代器指向元素。通过拼接一系列元素,您已经更改了迭代器指向的容器。该元素不再是A的元素;它是B的一个元素。迭代器在splice之间保留,因此pp_copy仍将指向这些元素。

现在它们只是在不同容器中的迭代器。

答案 1 :(得分:0)

基本上是因为这是list::splice的定义行为:

  

没有迭代器或引用变得无效,移动元素的迭代器仍然有效,但现在引用*this,而不是其他。