繁体   English   中英

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

[英]How to reverse a list using an iterator in c++

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

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

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

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/

您也可以按列表执行

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());

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

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

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

此外,如果要在适当的位置反转列表,可以使用此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 << " ";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM