【STL】反向迭代器(Reverse Iterator)
2017-05-20 13:27
429 查看
1. 定义
反向迭代器(Reverse Iterator)是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++运算将访问前一个元素,而–运算则访问下一个元素。
2. 作用
(1)反向迭代器需要使用自减操作符:标准容器上的迭代器(reverse_iterator)既支持自增运算,也支持自减运算。但是,流迭代器由于不能反向遍历流,因此流迭代器不能创建反向迭代器。
(2)可以通过reverse_iterator::base()将反向迭代器转换为普通迭代器使用,从逆序得到普通次序。这是因为:有些容器的成员函数只接受iterator类型的参数,所以如果你想要在ri所指的位置插入一个新元素,你不能直接这么做,因为vector的insert函数不接受reverse_iterator。如果你想要删除ri 所指位置上的元素也会有同样的问题。erase成员函数会拒绝reverse_iterator,坚持要求iterator。为了完成删除和一些形式的插入操作,你必须先通过base函数将reverse_iterator转换成iterator,然后用iterator来完成工作。
3. 例子
[cpp] view plain copy print?void test_reverse()
{
int a[] = {-2, -1, 0, 1, 2, 3, 4};
std::list<int> lst(a, a + sizeof(a)/sizeof(int));
std::copy(lst.begin(), lst.end(), std::ostream_iterator<int>(std::cout, “ ”));
std::cout << std::endl;
std::list<int>::reverse_iterator rit = lst.rbegin();
while(rit != lst.rend())
std::cout << *rit++ << ” ”;
std::cout << std::endl;
// 使用base()实现insert或erase等操作。
std::vector<int> vect(a, a + sizeof(a)/sizeof(int));
// 反向迭代器指向2
std::vector<int>::reverse_iterator vrit = std::find(vect.rbegin(), vect.rend(), 2);
// 注意:正向迭代器是指向3
std::vector<int>::iterator it(vrit.base());
inserter(vect, it) = 10;
std::copy(vect.begin(), vect.end(), std::ostream_iterator<int>(std::cout, “ ”));
std::cout << std::endl;
}
输出结果:
[cpp] view plain copy print?-2 -1 0 1 2 3 4 4 3 2 1 0 -1 -2 -2 -1 0 1 2 10 3 4 请按任意键继续. . .
反向迭代器(Reverse Iterator)是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++运算将访问前一个元素,而–运算则访问下一个元素。
2. 作用
(1)反向迭代器需要使用自减操作符:标准容器上的迭代器(reverse_iterator)既支持自增运算,也支持自减运算。但是,流迭代器由于不能反向遍历流,因此流迭代器不能创建反向迭代器。
(2)可以通过reverse_iterator::base()将反向迭代器转换为普通迭代器使用,从逆序得到普通次序。这是因为:有些容器的成员函数只接受iterator类型的参数,所以如果你想要在ri所指的位置插入一个新元素,你不能直接这么做,因为vector的insert函数不接受reverse_iterator。如果你想要删除ri 所指位置上的元素也会有同样的问题。erase成员函数会拒绝reverse_iterator,坚持要求iterator。为了完成删除和一些形式的插入操作,你必须先通过base函数将reverse_iterator转换成iterator,然后用iterator来完成工作。
3. 例子
[cpp] view plain copy print?void test_reverse()
{
int a[] = {-2, -1, 0, 1, 2, 3, 4};
std::list<int> lst(a, a + sizeof(a)/sizeof(int));
std::copy(lst.begin(), lst.end(), std::ostream_iterator<int>(std::cout, “ ”));
std::cout << std::endl;
std::list<int>::reverse_iterator rit = lst.rbegin();
while(rit != lst.rend())
std::cout << *rit++ << ” ”;
std::cout << std::endl;
// 使用base()实现insert或erase等操作。
std::vector<int> vect(a, a + sizeof(a)/sizeof(int));
// 反向迭代器指向2
std::vector<int>::reverse_iterator vrit = std::find(vect.rbegin(), vect.rend(), 2);
// 注意:正向迭代器是指向3
std::vector<int>::iterator it(vrit.base());
inserter(vect, it) = 10;
std::copy(vect.begin(), vect.end(), std::ostream_iterator<int>(std::cout, “ ”));
std::cout << std::endl;
}
void test_reverse() { int a[] = {-2, -1, 0, 1, 2, 3, 4}; std::list<int> lst(a, a + sizeof(a)/sizeof(int)); std::copy(lst.begin(), lst.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; std::list<int>::reverse_iterator rit = lst.rbegin(); while(rit != lst.rend()) std::cout << *rit++ << " "; std::cout << std::endl; // 使用base()实现insert或erase等操作。 std::vector<int> vect(a, a + sizeof(a)/sizeof(int)); // 反向迭代器指向2 std::vector<int>::reverse_iterator vrit = std::find(vect.rbegin(), vect.rend(), 2); // 注意:正向迭代器是指向3 std::vector<int>::iterator it(vrit.base()); inserter(vect, it) = 10; std::copy(vect.begin(), vect.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; }
输出结果:
[cpp] view plain copy print?-2 -1 0 1 2 3 4 4 3 2 1 0 -1 -2 -2 -1 0 1 2 10 3 4 请按任意键继续. . .
-2 -1 0 1 2 3 4 4 3 2 1 0 -1 -2 -2 -1 0 1 2 10 3 4 请按任意键继续. . .
相关文章推荐
- 【STL】反向迭代器(Reverse Iterator)
- C++ STL(24):Stream Iterator,reverse_iterator,raw_storage_iterator(迭代器)
- STL 逆向迭代器 reverse_iterator 的逻辑位置与实际位置
- 【C++ STL学习之八】逆向迭代器reverse_iterator
- vector<_T>::reverse_iterator 反向迭代器分析
- 从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
- 反向迭代器reverse_iterator
- 【C++ STL学习之八】逆向迭代器reverse_iterator
- 反向迭代器(Reverse Iterator)
- set容器元素的插入和中序遍历,反向遍历,反向迭代器reverse_iterator和rbegin(),rend();
- 反向迭代器reverse_iterator与正向迭代器iterator之间的转换(list反向删除元素的方法)
- C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
- leetcode_67题——Add Binary(字符串string,反向迭代器reverse_iterator,栈stack)
- C++语法基础--泛型算法(generic algorithm)--反向迭代器,reverse_iterator::base()
- 从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
- STL学习笔记--3、迭代器iterator与traits编程
- STL源码分析读书笔记--第三章--迭代器(iterator)概念与traits编程技法
- STL中 如何在遍历中使用 iterator/reverse_iterator 删除元素
- STL 模板库中迭代器 iterator 失效问题
- STL之Iterator(迭代器)