我有一个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),有没有更好的方法呢?
答案 0 :(得分:22)
我认为你的意思是:
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*
(有效),则上面的第一个表格格式不正确。无论如何,后两者都有效,所以更可取。
答案 1 :(得分:10)
你这样做会给你一个错误的迭代器,因为 post increment 不会改变值,直到在分配之后。
总有这样:
auto it = std::prev(container.end());
请记住首先检查容器是否为空,以便迭代器存在于有效范围内。
答案 2 :(得分:8)