在前面对于该问题的讨论中,我们都知道调用 std::vector::erase 只会使位于删除元素 后 的迭代器失效。但是,在删除一个元素后,位于该位置的迭代器是否仍然有效(当然,在删除之后,它不指向 end())?
对于向量的实现方式的理解表明,该迭代器绝对可以使用,但我不确定这是否会导致未定义的行为。
作为一个示例,以下代码从向量中删除所有奇数整数。此代码是否会导致未定义的行为?
<code class="cpp">typedef std::vector<int> vectype; vectype vec; for (int i = 0; i <p>该代码在我的机器上运行良好,但这并不能说服我它是有效的。</p> <h3>迭代器的有效性</h3> <p><strong>不</strong>;在传递给 erase 的迭代器处或之后的 <strong>所有迭代器都将失效</strong>。</p> <p>但是,erase 返回一个新迭代器,指向被删除元素(或如果没有这样的元素,则指向末尾)之后的元素。您可以使用此迭代器来恢复迭代。</p> <p>请注意,这种删除奇数元素的方法非常低效:每次删除一个元素时,其后的所有元素都必须在向量中向左移动一位(这是 O(n<sup>2</sup>))。您可以使用 Erase-Remove 惯用用法(O(n))更有效地完成这项任务。您可以创建一个 is_odd 谓词:</p> <pre class="brush:php;toolbar:false"><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中文网其他相关文章!