微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以下列方式纠正std :: vector迭代器无效是否有效?

如何解决以下列方式纠正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 举报,一经查实,本站将立刻删除。