gpt4 book ai didi

c++ - Vector.end() 在 C++ 中删除元素后的意外行为

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:09 28 4
gpt4 key购买 nike

我在删除 vector 中的重复值时遇到问题。我知道当一个 vector 值被删除时, vector 被重新分配以维护数据而没有任何“暗洞”。问题是,当我在循环中使用 remove() 时,当代码运行回它的条件语句时,我收到断言失败消息。

我的问题是:如果我在迭代条件下使用 nums.end() ,它是否获得迭代器的静态值,或者对于每次迭代它返回一个指向新重新分配 vector 末尾的新迭代器?如果是或不是,递增似乎有什么问题?

while ( itfast != nums.end()) {
if (*itslow == *itfast) {
nums.erase(itfast);
}
else {
itslow++;
itfast++;
}
}

最佳答案

std::vector.erase 使当前迭代器无效,但返回指向下一个有效迭代器的迭代器,该迭代器已被删除。

itfast = nums.erase(itfast);

正如 Daniel 所指出的,这将使您拥有的任何其他迭代器失效,因此您还必须处理 itslow 情况。

当处理更复杂的删除时,它可以更简单,更不容易出错,而不是处理索引,尽管如果你删除一个元素并且 itslow >= removed element 也有关于 itslow 的陷阱。没有看到您的确切问题是什么,我不能准确地说出要使用哪个。

有关删除的更多详细信息,请参阅 cppreference。还有其他几个问题与此非常相似。

https://en.cppreference.com/w/cpp/container/vector/erase std::vector iterator invalidation

关于c++ - Vector.end() 在 C++ 中删除元素后的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57834807/

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