在前面对于该问题的讨论中,我们都知道调用 std::vector::erase 只会使位于删除元素 后 的迭代器失效。但是,在删除一个元素后,位于该位置的迭代器是否仍然有效(当然,在删除之后,它不指向 end())?
对于向量的实现方式的理解表明,该迭代器绝对可以使用,但我不确定这是否会导致未定义的行为。
作为一个示例,以下代码从向量中删除所有奇数整数。此代码是否会导致未定义的行为?
<code class="cpp">typedef std::vector<int> vectype; vectype vec; 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); else ++it; }</code>
该代码在我的机器上运行良好,但这并不能说服我它是有效的。
不;在传递给 erase 的迭代器处或之后的 所有迭代器都将失效。
但是,erase 返回一个新迭代器,指向被删除元素(或如果没有这样的元素,则指向末尾)之后的元素。您可以使用此迭代器来恢复迭代。
请注意,这种删除奇数元素的方法非常低效:每次删除一个元素时,其后的所有元素都必须在向量中向左移动一位(这是 O(n2))。您可以使用 Erase-Remove 惯用用法(O(n))更有效地完成这项任务。您可以创建一个 is_odd 谓词:
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; }</code>
然后,可以将其传递给 remove_if:
<code class="cpp">vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
以上是以下是您可以考虑的文章标题: **Is It Safe to Use an Iterator After `std::vector::erase()` When Deleting the Element It Points To?** 这个标题直截了当地问了一个问题,并且准确地反映了文章的内容,即探讨在删除指向元素的迭代器后是否可以继续使用该迭代器。 这里还有另外一些选择: * **I的详细内容。更多信息请关注PHP中文网其他相关文章!