gpt4 book ai didi

c++ - std::vector 迭代器失效

转载 作者:IT老高 更新时间:2023-10-28 22:33:04 25 4
gpt4 key购买 nike

之前有几个关于这个问题的问题;我的理解是,调用 std::vector::erase 只会使位于已删除元素 位置的迭代器无效。但是,在删除一个元素之后,该位置的迭代器是否仍然有效(当然,前提是它在删除后不指向 end())?

我对如何实现 vector 的理解似乎表明迭代器绝对可用,但我不完全确定它是否会导致未定义的行为。

作为我正在谈论的示例,以下代码从 vector 中删除所有奇数。此代码是否会导致未定义的行为?

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;
}

代码在我的机器上运行良好,但这并不能让我相信它是有效的。

最佳答案

after erasing an element, is the iterator at that position still valid

没有;传递给 erase 的迭代器处或之后的所有迭代器都无效。

但是,erase 返回一个新的迭代器,它指向紧跟在被删除元素之后的元素(如果没有这样的元素,则指向末尾)。您可以使用此迭代器来恢复迭代。


请注意,这种删除奇数元素的特殊方法效率很低:每次删除一个元素时,它之后的所有元素都必须在 vector 中向左移动一个位置(这是 O(n 2))。您可以使用 erase-remove idiom 更有效地完成这项任务。 (上))。您可以创建一个 is_odd 谓词:

bool is_odd(int x) { return (x % 2) == 1; }

然后这可以传递给remove_if:

vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd), vec.end());

关于c++ - std::vector 迭代器失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3747691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com