【问题标题】:Does std::string::resize(smaller_than_capacity) guarantee existing iterators are still valid?std::string::resize(smaller_than_capacity) 是否保证现有迭代器仍然有效?
【发布时间】:2021-09-24 16:17:57
【问题描述】:

根据cpprefstd::vector::resize明确保证:

当调整到更小的尺寸时,矢量容量永远不会减少,因为 这将使所有迭代器无效,而不仅仅是那些 将被等效的pop_back() 调用序列无效。

但是,我在documentationstd::string::resize 中找不到任何类似的保证。

是否std::string::resize(smaller_than_capacity)保证现有迭代器仍然有效?

【问题讨论】:

  • 调整到小于当前的capacity 永远不会重新分配内存,这就是shrink_to_fit() 的引入目的。但是,如果新的size 小于当前的size,那么任何现有的迭代器>= 旧的size 都应该失效,因为它们现在将超过新的end
  • 有引用吗?
  • 我不知道,但是这样的失效只是逻辑思维,因为没有迭代器可以在当前end之后有效,所以如果end被移动,旧的迭代器应该变得无效,如果他们已经过了新的end
  • @RemyLebeau 标准不保证。
  • 一个字符串在调整较小时可能(可能)被移动到 SSO 区域,这会导致失效。

标签: c++ string vector standards c++20


【解决方案1】:

标准中不存在此类要求。见 21.3.3.2:

引用 a 元素的引用、指针和迭代器 basic_string 序列可能因以下用途而失效 那个 basic_string 对象:

(4.1) 作为参数传递给任何 引用非常量的标准库函数 basic_string 作为参数。

(4.2) 调用非常量成员 函数,除了 operator[]、at、data、front、back、begin、rbegin, 结束,然后撕裂。

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 2015-03-13
    • 2015-04-29
    • 2019-02-17
    • 1970-01-01
    • 2015-10-12
    • 2016-02-12
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多