如何解决以下列方式纠正std :: vector迭代器无效是否有效?
使用C ++ 11或更高版本,假设我们将指向某个元素的迭代器存储在向量中:
std::vector<int> v{1,2,3,4,5};
auto it = v.begin() + 2; // it points to 3
现在,擦除一个元素或指向该元素之前的元素将使it
无效。我假设擦除一个元素不会导致内存重新分配(可能不正确吗?),因此按如下所示纠正it
会是有效且定义明确的行为:
--it;
v.erase(v.begin());
// it still points to 3 in all cases?
Godbolt:https://godbolt.org/z/3dzrcW
解决方法
否。
来自cppreference
使擦除点或擦除点之后的迭代器和引用无效,包括
end()
迭代器。
v.erase(v.begin());
已使所有迭代器无效。使用it
具有不确定的行为。
没有办法“校正”迭代器无效。一旦迭代器对象无效,您可以对它执行的 only 操作就是为其分配一个有效的迭代器值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。