字符串::是否替换了迭代器和引用?
Does string::replace invallidate iterators and references?
>您好,我已经搜索了类字符串的迭代器和引用无效,但没有找到结果。
我有这个代码:
int main(){
std::string s = "const char* manipulation in C++";
auto beg = s.cbegin();
auto& r = *s.begin();
std::cout << s << std::endl;
std::cout << "*beg: " << *beg << std::endl;
std::cout << "r: " << r << std::endl;
s.replace(beg, beg + 11, "string");
std::cout << s << std::endl;
std::cout << "*beg: " << *beg << std::endl;
std::cout << "r: " << r << std::endl;
}
输出:
const char* manipulation in C++
*beg: c
r: c
string manipulation in C++
*beg: s
r: s
它看起来不错,但我不知道它是否是未定义的行为。 谢谢!
根据此参考:
与此对象相关的任何迭代器、指针和引用都可能是 失效。
根据 [string.require],似乎是这样:
引用
basic_string
序列元素的引用、指针和迭代器可能会因该basic_string
对象的以下用法而失效:—调用非常量成员函数,除了
operator[]
、at
、data
、front
、back
、begin
、rbegin
、end
和rend
。
我相信,如果你把字符串小replace
,实现可能会决定减少容量,这将重新分配。
更新
根据 C++11 标准,replace
使用的重载仅指定out_of_range
例外。这意味着(?(,replace
本身不能重新分配,因此它不能改变其容量。不过,我不确定库函数是否会抛出未特别指定的异常。
在引用的草案中,相关的重载还提到了分配器的allocate
成员函数引发的异常,这意味着重新分配的可能性。我没有看到任何子句将此异常规范限制为仅替换导致原始字符串放大的情况。
相关文章:
- 不明白迭代器,引用和指针失效,一个例子
- C 地图 - 自引用迭代器
- 如何在find_if谓词中引用迭代器
- 尝试取消引用迭代器的分段错误
- 如何通过引用迭代器的解引用使幂等性
- 双取消引用迭代器的返回类型
- 正在返回与对象相同的取消引用迭代器
- 取消引用迭代器会导致'can not convert'错误,而它似乎不应该
- 通过取消引用迭代器将Vector写入文件
- 为什么我不能取消引用迭代器?
- 为什么我需要取消引用迭代器
- STL集合的去引用迭代器
- 递增解引用迭代器
- c++在解引用迭代器时x++与x = x+ 1的区别
- 指针向量解引用迭代器时出现段错误
- 标准如何处理容器插入函数中的自引用迭代器?
- 作为boost::bind复合链的一部分的解引用迭代器
- 解引用迭代器(c++)
- C++类型的去引用迭代器
- std::for_each等效项,它不取消引用迭代器