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

How to reverse a list using an iterator in c++

本文关键字:迭代器 列表 c++      更新时间:2023-10-16

我想用迭代器反转列表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/

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

可以使用reverse_iterator反向遍历容器。

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

至于访问列表的第三个元素,你必须迭代它。不能直接访问列表中的元素

你也可以通过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());

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