std::vector 迭代器失效:挖掘擦除后迭代器的有效性
在 C 领域,向量迭代器的复杂性和他们在删除后的行为可能会造成混乱。为了深入研究这个问题,我们将探讨一个特定的场景:
在擦除操作后验证迭代器的持久性
直接指向迭代器的有效性会出现相关问题到 std::vector 中被删除的元素。普遍的观念是指向被擦除元素之后的位置的迭代器是无效的。然而,问题仍然存在:指向被删除元素的确切位置的迭代器仍然有效吗?
分析和示例
为了阐明这个问题,请考虑以下代码片段尝试从向量中消除所有奇数整数:
<code class="cpp">vector<int> vec; for (int i = 0; i < 100; ++i) vec.push_back(i); vector<int>::iterator it = vec.begin(); while (it != vec.end()) { if (*it % 2 == 1) vec.erase(it); else ++it; }</code>
虽然此代码可能看起来运行正常,但深入研究以确定其有效性至关重要。
回答问题
答案明确指出,不仅指向被擦除元素之后位置的迭代器无效,而且指向该元素确切位置的迭代器也无效。
但是,擦除元素会提供一个返回的迭代器,该迭代器立即指向被删除的元素之后,或者如果没有剩余元素则指向末尾。这允许无缝继续迭代。
有效消除奇数元素
值得注意的是,所提供的代码片段并不是删除奇数元素的最有效方法。一种更有效的方法涉及擦除-删除习惯用法,它利用自定义谓词来定位和识别要删除的元素。例如,我们可以定义一个名为 is_odd 的谓词,并将其与remove_if和erase一起使用:
<code class="cpp">bool is_odd(int x) { return (x % 2) == 1; } vec.erase(remove_if(vec.begin(), vec.end(), is_odd), vec.end());</code>
这消除了昂贵的元素移动,将时间复杂度降低到O(n)。
以上是## 在 `std::vector` 中删除元素的迭代器仍然有效吗?的详细内容。更多信息请关注PHP中文网其他相关文章!