如何在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/
这里你可以看到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 << " ";
}
相关文章:
- 跟随整数索引列表的自定义类迭代器
- 列表的有效性在插入后开始迭代器
- C++列表迭代器
- 测试迭代器是否位于列表中的最后一个
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- C++不能取消引用结束列表迭代器
- 创建以向量/列表迭代器为键的映射
- 对列表中的向量使用迭代器
- 使用列表迭代器获取所有值
- 如何实现列表:<T>:迭代器?
- 将列表迭代器存储为成员
- 将列表 en 列表迭代器作为指针 C++ 传递
- 如何从该列表的元素中获取 std::list<T>::迭代器?
- 空列表迭代器比较始终为真
- 如何在给定迭代器列表的情况下从向量中删除元素
- C++迭代器列表
- 迭代器列表,用于从各种列表中收集条目
- 如何在 Map 中存储集合容器的迭代器列表
- 迭代器列表
- 操作迭代器列表+指针