为什么C++在使用容器时不会使 begin() 失效
Why C++ doesn't invalidate begin() when using containers
当我读到使用容器的insert()或erase()方法可以使容器无效时,因此最好不要在执行插入()或erase()操作之前使用迭代器缓存容器的末尾,我很困惑为什么只有容器的最后一个位置无效,而不是第一个位置。(书中没有建议我们不应该缓存引用容器的begin()的迭代器)。
这似乎是一个愚蠢的问题,但"无效"并不意味着容器中元素的地址完全更改吗?我们如何确定容器开头的地址始终保持不变?
每个容器都有自己的规范,规定哪些操作会使哪些迭代器无效。规范基于预期的实现。
例如,向量上的erase()
只会使超过新端点的迭代器失效,因为erase()
所做的只是销毁新端以外的对象并更新向量的大小:这意味着新端之前的对象不会被销毁,并且它们保持相同的内存位置,因此迭代器和指向这些对象的指针保持不变。
另一方面,如果新size()
大于当前capacity()
,则向量上的insert()
将导致内部缓冲区被重新分配,这意味着所有对象都可能被移动,因此所有迭代器和指向向量的指针都将失效,包括begin()
。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 调用'begin(int [n])'没有匹配函数
- 为constchar*定义std::begin合法吗
- 不明白迭代器,引用和指针失效,一个例子
- constexpr begin of a std::array
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- std::unordered_map::提取引用/指针失效
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 了解向量中的 .begin 和 .end
- 混淆 Begin() 方法作为参数
- std::ranges::begin 和 std::begin 有什么区别?
- C++ const char with .begin() and .end()
- 有没有函数可以在擦除 c++ 中获取 deque.begin() 的 int 值?
- 为什么 string::begin() 在即时窗口中输出整个字符串
- 如果没有重新散列,为什么 unordered_set::begin() 会改变?
- 为什么 std::find( s.begin(), s.end(), val ) 比集合 s 的 s.find(val) 慢 1000 倍<int>?
- begin() 在 C++17 年被制作为 constexpr 但在 C++14 年成为 cbegin() 吗?
- 如何使用vector.begin()和vector.end()遍历矩阵?
- 为什么C++在使用容器时不会使 begin() 失效