簡體   English   中英

+= 運算符后 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()時,我想知道為什么會這樣。 我在 inte.net 上找不到任何東西。

當你像 vector 或 string 一樣擴展 cointainer 時,有時他們可能會將他們的 memory 重新分配到新位置 - 所以它會改變地址。 他們需要連續的 memory,因為列表中沒有指向下一個元素的指針。

迭代器遍歷連續的 memory 個地址。 下一個元素是地址+1。

因此,開始時,字符串中的第一個元素存儲在地址 X 中。但是您添加了幾個字母,導致將容器重新分配到新位置。 現在,您的字符串未存儲在地址 X 中,而是存儲在地址 Y 中。盡管如此,您的迭代器仍指向地址 X。

添加或刪除元素時,您不能在不重新初始化的情況下使用迭代器,因為這些操作會導致迭代器失效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM