使用 end() 迭代到 std::vector 的最后一个元素--

新手上路,请多包涵

我有一个 std::vector 我想要 iterator 到向量中的最后一个元素;我将存储这个迭代器供以后使用。

注意:我想要一个迭代器引用它,而不是 std::vector::back 。因为我希望以后能够从 std::vector::begin 计算这个对象的索引。

以下是我将迭代器获取到最后一个元素的逻辑:

 std::vector<int> container;
std::vector<int>::iterator it = container.end()--;

由于 std::vector::end 具有 O(1) 时间复杂度,有没有更好的方法来做到这一点?

原文由 Quark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

我想你的意思是:

 std::vector<int>::iterator it = --container.end();
std::vector<int>::iterator it = container.end() - 1;
std::vector<int>::iterator it = std::prev(container.end());

您无意中只是返回 end() 。但是所有这些的问题是当向量为空时会发生什么,否则它们都会在恒定时间内做正确的事情。尽管如果向量为空,则无论如何都没有最后一个元素。

存储迭代器时也要小心——它们可能会失效。

请注意,如果 vector<T>::iterator 只是 T* (这将是有效的),则上面的第一种形式是错误的。后两个工作无论如何,所以是可取的。

原文由 Barry 发布,翻译遵循 CC BY-SA 3.0 许可协议

你这样做的方式会给你错误的迭代器,因为 后增量 在分配 之后 才会改变值。

总是有这样的:

 auto it = std::prev(container.end());

请记住首先检查容器是否为空,以便您的迭代器存在于有效范围内。

原文由 Galik 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题