我试图理解在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()
。
答案 0 :(得分:3)
list
迭代器指向元素。通过拼接一系列元素,您已经更改了迭代器指向的容器。该元素不再是A
的元素;它是B
的一个元素。迭代器在splice
之间保留,因此p
和p_copy
仍将指向这些元素。
现在它们只是在不同容器中的迭代器。
答案 1 :(得分:0)
基本上是因为这是list::splice
的定义行为:
没有迭代器或引用变得无效,移动元素的迭代器仍然有效,但现在引用
*this
,而不是其他。