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

Iterator to last element of std::vector using end()--

本文关键字:vector 最后一个 元素 std end 迭代 使用      更新时间:2023-10-16

我有一个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)时间复杂性,有更好的方法吗?

我想你的意思是:

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*(这将是有效的),则上面的第一种形式是不成形的。不管怎样,后两者都有效,因此更可取。

您有rbegin,它可以满足您的需求

cplusplus参考

auto last = container.rbegin();

执行此操作的方式会给您提供错误的迭代器,因为后增量直到赋值后才更改值。

总是这样:

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

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