有人能解释一下他们的意思是list.pushback文档(不会使迭代器无效)吗
can someone explain what they mean is list.pushback documentation (does not invalidate iterators)
在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
不会更改其他元素,因此迭代器和对这些元素的引用仍然有效。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 有人能解释一下他们的意思是list.pushback文档(不会使迭代器无效)吗