指向 std::list 中最后一个元素的迭代器

问题描述 投票:0回答:8
#include <list>
using std::list;

int main()
{
    list <int> n;
    n.push_back(1);
    n.push_back(2);
    n.push_back(3);

    list <int>::iterator iter = n.begin();
    std::advance(iter, n.size() - 1); //iter is set to last element
}

还有其他方法可以迭代到列表中的最后一个元素吗?

c++ stl
8个回答
119
投票

是的,您可以从最后返回一处。 (假设您知道列表不为空。)

std::list<int>::iterator i = n.end();
--i;

91
投票

以下任一操作都会将

std::list<int>::iterator
返回到
list
中的最后一项:

std::list<int>::iterator iter = n.end();
--iter;

std::list<int>::iterator iter = n.end();
std::advance(iter, -1);

// C++11
std::list<int>::iterator iter = std::next(n.end(), -1);

// C++11
std::list<int>::iterator iter = std::prev(n.end());

以下命令将返回

std::list<int>::reverse_iterator
list
中的最后一项:

std::list<int>::reverse_iterator iter = std::list::rbegin();

12
投票

使用反向迭代器:

iter = (++n.rbegin()).base()

作为旁注:此方法或 Charles Bailey 方法具有恒定的复杂性,而

std::advance(iter, n.size() - 1);
具有列表的线性复杂性 [因为它具有双向迭代器]。


7
投票

乘坐

end()
并向后走一圈。

list <int>::iterator iter = n.end();
cout << *(--iter);

6
投票
std::list<int>::iterator iter = --n.end();
cout << *iter;

1
投票

您可以编写自己的函数,从给定的迭代器中获取上一个(和下一个)迭代器(当我需要使用

std::list
进行“向后查找”和“向前查找”时,我使用了该迭代器):

template <class Iter>
Iter previous(Iter it)
{
    return --it;
}

然后:

std::list<X>::iterator last = previous(li.end());

顺便说一句,这也可能在 boost 库中可用(下一个和上一个)。


0
投票
list<int>n;
list<int>::reverse_iterator it;
int j;

for(j=1,it=n.rbegin();j<2;j++,it++)
cout<<*it;

0
投票

自c++11

auto last = std::prev(n.end());
© www.soinside.com 2019 - 2024. All rights reserved.