迭代器使用end()持续std :: vector的元素 -

Qua*_*ark 11 c++ stl vector c++11

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

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

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

std::vector<int> container;
std::vector<int>::iterator it = container.end()--;
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*rry 26

我认为你的意思是:

std::vector<int>::iterator it = --container.end();
std::vector<int>::iterator it = container.end() - 1;
std::vector<int>::iterator it = std::prev(container.end());
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,如果vector<T>::iterator只是T*(这将是有效的),上面的第一个表格是不正确的.第二个工作无论如何,所以更可取.

  • @quark 右值是临时值,修改它们没有意义;这就是为什么不允许使用修饰符“++”和“--”。请参阅[C++ 中的 R 值到底是什么?](http://stackoverflow.com/questions/9406121/what-exactly-is-ar-value-in-c)。但是,如果临时变量是类类型,则不会直接应用运算符,而是会转换为“operator--”调用,这在右值上是允许的 - 请参阅[Why myClassObj++++ does not incur a compile error : '++ '需要左值](http://stackoverflow.com/questions/6692037/why-myclassobj-doesnt-incur-a-compile-error-needs-l-value-just-as-bu)。 (3认同)
  • @MSalters 问题是关于“std::vector” (2认同)
  • @MarkRansom因为你不能递减一个右值指针. (2认同)

Gal*_*lik 10

你这样做的方式会给你错误的迭代器,因为在赋值之后,post增量不会改变值.

总有这样的:

auto it = std::prev(container.end());
Run Code Online (Sandbox Code Playgroud)

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


dau*_*ama 9

你可以rbegin做到你需要的

cplusplus参考

auto last = container.rbegin();
Run Code Online (Sandbox Code Playgroud)

  • 但是`rbegin`不返回迭代器,它返回一个reverse_iterator。 (2认同)