【发布时间】:2021-10-21 03:13:10
【问题描述】:
在调试我的代码时,我注意到存储迭代器发生了变化,指向 begin(),在每 4 或 5 次调用字符串上的 += 运算符之后(它指向的内容甚至不在字符串中)本身!)。这是我的代码的样子:
for (auto ch=word.begin(); ch!=word.end(); ++ch) {
// on a condition, the following loop starts
// ch == word.begin()
for (int i=0; ...) {
string_view tmp = arr[i];
word += tmp;
}
// ch is no longer equal to word.begin()
}
虽然在第二个循环解决了我的问题后将 ch 重新分配给 word.begin(),但我想知道为什么会发生这种情况。我在互联网上找不到任何东西。
【问题讨论】:
-
在迭代字符串时不能修改字符串,因为这些修改可能会导致底层存储被重新分配(使任何迭代器失效)。
-
如果/当重新分配字符串时,所有指向基础数据的迭代器/指针都将失效。
-
问问自己:如果数组始终是固定大小的,并且单词的大小在增加,当它需要变得比它使用的数组更大时会发生什么?
-
我可以看到 OPs 问题,在这两个页面中搜索 invalid std::string::clear 和 std::string::operator+= 大部分修改操作都缺少失效子句。
-
“我在互联网上找不到任何东西。”真的吗?当我从字面上复制并粘贴您的问题标题into a search engine 时,second result I get 显示了一个问题示例(由推回向量引起,这基本上是相同的情况)并附有详细说明.或者你可以尝试类似[
c++ tutorial iterator invalidation](duckduckgo.com/?q=c%2B%2B+tutorial+iterator+invalidation)。