std::string::begin() 迭代器在 += 运算符后是否无效?
Is std::string::begin() iterator invalid after += operator?
在调试我的代码时,我注意到存储的迭代器发生了变化,指向 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()
时,我想知道为什么会这样。我在互联网上找不到任何东西。
当您扩展诸如 vector 或 string 之类的容器时,有时它们可能会将内存重新分配到新位置 - 因此它会更改地址。他们需要连续的内存,因为列表中没有指向下一个元素的指针。
迭代器遍历连续的内存地址。下一个元素是 address+1.
因此,开始时,字符串中的第一个元素存储在地址 X 中。但是您添加了几个字母,导致容器重新分配到新位置。现在,您的字符串不存储在地址 X 中,而是存储在地址 Y 中。尽管如此,您的迭代器仍指向地址 X。
在添加或删除元素时,您不能在不重新初始化的情况下使用迭代器,因为这些操作会导致迭代器失效。
在调试我的代码时,我注意到存储的迭代器发生了变化,指向 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()
时,我想知道为什么会这样。我在互联网上找不到任何东西。
当您扩展诸如 vector 或 string 之类的容器时,有时它们可能会将内存重新分配到新位置 - 因此它会更改地址。他们需要连续的内存,因为列表中没有指向下一个元素的指针。
迭代器遍历连续的内存地址。下一个元素是 address+1.
因此,开始时,字符串中的第一个元素存储在地址 X 中。但是您添加了几个字母,导致容器重新分配到新位置。现在,您的字符串不存储在地址 X 中,而是存储在地址 Y 中。尽管如此,您的迭代器仍指向地址 X。
在添加或删除元素时,您不能在不重新初始化的情况下使用迭代器,因为这些操作会导致迭代器失效。