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中文网其他相关文章!