如何在c ++中使用迭代器反转列表

时间:2015-09-13 07:04:52

标签: c++ stl

我想使用迭代器来反转列表a = {1,2,3,4,5}。据我所知,我知道迭代器是一个指向列表中元素的指针。 所以有两个问题如下:

  • 为什么即使我指向列表中的最后一个元素然后将指针递减到先前的地址,此代码也会失败?

    list<int>::iterator i;
    for(i=l.end();i!=l.begin();i--)
       cout<<(*i);
    
  • 第二个问题是如何使用没有for循环的迭代器访问列表中的第三个元素。是否可以在不使用for循环的情况下访问它?如果可能,请说明语法。

4 个答案:

答案 0 :(得分:5)

l.end()指向最后一个元素之后,所以原则上你需要:

for(i=l.end()-1; i!=l.begin(); i--)              // invalid

但是当你到达时,你不会得到第一个元素(l.begin())。

此外,从列表迭代器中减去1是无效的,因此它必须是:

for(i=std::prev(l.end()); i!=l.begin(); i--)     // valid

但是你仍然遇到第一个元素的问题。

更好的方法是使用反向迭代器。类似的东西:

for (std::list<int>::reverse_iterator i = l.rbegin(); i != l.rend(); ++i)

对于你的第二个问题,你可以这样做:

auto it = l.begin();
cout << *(std::next(it, 2));

以下是取决于迭代器类型的有效操作列表:http://www.cplusplus.com/reference/iterator/

在这里你可以看到该列表有一个双向迭代器:http://www.cplusplus.com/reference/list/list/

答案 1 :(得分:1)

您也可以list

执行此操作
for (std::list<int>::reverse_iterator rit=mylist.rbegin(); rit!=mylist.rend(); ++rit)
    std::cout << ' ' << *rit;

你可以在C ++中通过Vector来完成。

int temp[] = {1,2,3,4,5};

std::vector<int>v(temp, temp+3);

std::vector<int> n_v(v.rbegin(), v.rend());

答案 2 :(得分:1)

您可以使用reverse_iterator反向移动容器。

list<int>::reverse_iterator i;
for(i=l.rbegin();i!=l.rend();i++)
    cout<<(*i);

至于访问列表的第3个元素,你必须迭代它。无法直接访问列表中的元素

答案 3 :(得分:0)

此外,如果您想要反转列表,可以使用此std::reverse

#include <iostream>
#include <list>
#include <algorithm>

int main()
{
    std::list<int> values { 1, 2, 3, 4, 5 };
    std::reverse(values.begin(), values.end());
    for (int i : values)
        std::cout << i << " ";
}