在list.pushback中,文档显示
由于%列表的性质,此操作可以在常量中完成时间,并且不会使迭代器和引用无效。
add如何不能更改迭代器?他们所说的不使引用无效是什么意思?
感谢
这意味着在调用push_back
之前获得的所有迭代器和引用在之后仍然可以使用
std::list<int> numbers { 2, 3, 5, 7};
auto it = numbers.begin();
int& r = numbers.front();
numbers.push_back(11);
std::cout << *it << 'n'; // guaranteed to print 2
std::cout << r << 'n'; // guaranteed to print 2
其他数据结构不一定提供这样的保证。如果使用向量而不是列表,则每次对push_back
的调用都可能使调用之前获得的所有迭代器和引用无效,因为容量可能会耗尽,在这种情况下,数据必须移动到更大的数组中。使用无效的迭代器或引用会导致未定义的行为(读作:任何事情都可能发生)。
作为一个例子,与行为std::vector
进行比较。如果你这样做:
std::vector<int> foo(1);
std::vector<int>::iterator it = foo.begin();
foo.push_back(2);
*it = 0;
这是非法的——调用push_back
的行为可能会导致矢量增长。这种增长会导致在释放旧的、较小的内存之前,分配新的内存,并将内容移动到其中。
std::list
不适用。它是一个链接列表,因此添加新元素时不会更改列表中的其他元素。增长纯粹是当地的事情。
将元素附加到list
不会更改其他元素,因此迭代器和对这些元素的引用仍然有效。