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



我试图了解在 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()

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

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

从根本上说,因为这是list::splice的定义行为:

没有迭代器

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

最新更新