std::vector 迭代器失效:擦除後使所有迭代器失效
眾所周知,從向量中擦除元素只會使指向的迭代器失效到被擦除元素之後的位置。然而,一個關鍵問題出現了:被擦除位置的迭代器還有效嗎?
根據 C 標準,答案是否定的。傳遞給擦除的迭代器或之後的所有迭代器均無效。這意味著以下旨在從向量中刪除奇數整數的程式碼將導致未定義的行為:
<code class="cpp">typedef std::vector<int> vectype; vectype vec; // Initialize the vector for (int i = 0; i < 100; ++i) vec.push_back(i); vectype::iterator it = vec.begin(); while (it != vec.end()) { if (*it % 2 == 1) vec.erase(it); // Invalidating iterator else ++it; }</code>
正確處理迭代
處理迭代擦除後正確地使用擦除傳回的迭代器。此迭代器指向緊接已擦除元素之後的元素(如果沒有,則指向末尾)。
在這種情況下,刪除奇數整數的更有效方法是使用擦除 -刪除習語:
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; } vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
以上是## 在 `std::vector` 上 `erase` 之後,所有迭代器都無效嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!