1

在 list.pushback 文档中说

由于 %list 的性质,此操作可以在恒定时间内完成,并且不会使迭代器和引用无效。

add 如何不能改变迭代器?他们所说的不使引用无效是什么意思?

谢谢

4

3 回答 3

3

这意味着在调用之前获得的所有迭代器和引用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都可能使调用之前获得的所有迭代器和引用无效,因为容量可能会耗尽,在这种情况下,必须将数据移动到更大的数组中。使用无效的迭代器或引用会导致未定义的行为(阅读:任何事情都可能发生)。

于 2012-07-31T07:35:45.843 回答
1

作为一个例子与行为进行比较std::vector。如果你这样做:

std::vector<int> foo(1);
std::vector<int>::iterator it = foo.begin();

foo.push_back(2);

*it = 0;

这是非法的 - 调用行为push_back可能导致向量增长。这种增长会导致分配新内存并将内容移入其中,然后再释放较旧的较小内存。

std::list不适用。它是一个链表,因此当您添加新元素时,列表中的其他元素不会更改。增长纯粹是本地的事情。

于 2012-07-31T07:37:06.857 回答
0

将元素附加到list不会更改其他元素,因此对这些元素的迭代器和引用仍然有效

于 2012-07-31T07:35:56.400 回答