首页  >  文章  >  后端开发  >  ## 在 `std::vector` 上 `erase` 之后,所有迭代器都无效吗?

## 在 `std::vector` 上 `erase` 之后,所有迭代器都无效吗?

Barbara Streisand
Barbara Streisand原创
2024-10-25 10:43:30575浏览

## Are All Iterators Invalid After `erase` on a `std::vector`?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn