STL迭代器之迭代器适配器:Reverse Iterators
来源:互联网 发布:尖头平底鞋 知乎 编辑:程序博客网 时间:2024/06/07 10:27
迭代器适配器:
这些特殊的迭代器允许算法在反转,插入,流中操作。
Reverse Iterators
Reverse Iterators重新定义++,--操作符为了它们的行为像Reverse.因此如果你用Reverse Iterators
代替平常的迭代器,算法处理元素以相反的顺序,所有的容器都支持用Reverse Iterators的能力。
一个有趣的例子:
vector<int> col1;
for (int i=1;i<=9;++i) col1.push_back(i);
vector<int>::iterator pos;
pos= find(col1.begin(),col1.end(),5);
cout<<"pos:"<<*pos<<endl;
vector<int>::reverse_iterator rpos(pos);
cout<<"rpor:"<<*rpos<<endl;
输出的结果是:
Pos:5
Rpos:4
若将
pos= find(col1.begin(),col1.end(),5);
改为
pos= find(col1.begin(),col1.end(),3);
输出的结果是:
Pos:3
Rpos:2
rpos总是指向pos的前一个值,为什么呢?候捷先生译的《C++标准模板库》里是这么解释的:“注意,这不是bug,这是特性!导致这个行为的原因是区间的半开性。为了能够指定容器内所有元素,我们必须运用‘最后一个元素的下一位置’。”“逆向迭代器的设计者运用了一个小技巧:他们实际上倒置了‘半开原则’”。:“‘将一个迭代器转化为逆向迭代器的过程中保持(履行)的是实际位置(元素)而非逻辑位置(数值)’,这句话的意思是,当pos转换为rpos,它们指向同一个实际地点,但它们所代表的意义(或说所代表的逻辑位置或数值)却变得不同了。”。从逆向迭代器的实现来看,书中所指的“实际位置”或“实际地点”,就是current。问题的原因结果就如下图表表。
例子:
deque<int> coll;
for (int i=1; i<=9; ++i) {coll.push_back(i);}
deque<int>::iterator pos1;
pos1 = find (coll.begin(), coll.end(),2);
deque<int>::iterator pos2;
pos2 = find (coll.begin(), coll.end(), 7);
for_each (pos1, pos2,print);
cout << endl;
deque<int>::reverse_iterator rpos1(pos1);
deque<int>::reverse_iterator rpos2(pos2);
for.each (rpos2, rpos1,print);
cout << endl;
output:
1 2 3 4 5 6 7 8 9
2 3 4 5 6
6 5 4 3 2
迭代器pos1,pos2要求半开范围[pos1,pos2)包括2但不包括7。当这范围转换为Reverse Iterators时,那个范围仍然保持着合法并且处理按相反的顺序。
所以, rbegin()就是简单的像这样:
container: :reverse_iterator(end())
rend()简单像这样:
container: :reverse_iterator(begin())
我们可以把Reverse Iterators再转换诶正常的迭代器
namespace std {
template <class Iterator>
class reverse_iterator ... {
...
Iterator base() const;
...
};
}
调用Reverse Iterators的成员函数base()就行了。
这些特殊的迭代器允许算法在反转,插入,流中操作。
Reverse Iterators
Reverse Iterators
代替平常的迭代器,算法处理元素以相反的顺序,所有的容器都支持用Reverse Iterators
一个有趣的例子:
vector<int> col1;
for (int i=1;i<=9;++i) col1.push_back(i);
vector<int>::iterator pos;
pos= find(col1.begin(),col1.end(),5);
cout<<"pos:"<<*pos<<endl;
vector<int>::reverse_iterator rpos(pos);
cout<<"rpor:"<<*rpos<<endl;
输出的结果是:
Pos:5
Rpos:4
若将
pos= find(col1.begin(),col1.end(),5);
改为
pos= find(col1.begin(),col1.end(),3);
输出的结果是:
Pos:3
Rpos:2
rpos
例子
deque<int> coll;
for (int i=1; i<=9; ++i) {coll.push_back(i);}
deque<int>::iterator pos1;
pos1 = find (coll.begin(), coll.end(),2);
deque<int>::iterator pos2;
pos2 = find (coll.begin(), coll.end(), 7);
for_each (pos1, pos2,print);
cout << endl;
deque<int>::reverse_iterator rpos1(pos1);
deque<int>::reverse_iterator rpos2(pos2);
for.each (rpos2, rpos1,print);
cout << endl;
output:
1 2 3 4 5 6 7 8 9
2 3 4 5 6
6 5 4 3 2
迭代器pos1,pos2
所以, rbegin()
rend()
我们可以把Reverse Iterators
namespace std {
template <class Iterator>
class reverse_iterator ... {
...
Iterator base() const;
...
};
}
调用Reverse Iterators
0 0
- STL迭代器之迭代器适配器:Reverse Iterators
- c++stl之逆向迭代器 Reverse Iterators
- Reverse Iterators(逆向迭代器)
- STL源码剖析(3):迭代器(iterators)
- 迭代器(Iterators)
- 迭代器 Iterators
- STL Iterators
- STL Iterators
- STL iterators
- STL Iterators
- STL iterators
- C#2.0介绍之Iterators(迭代器)
- 迭代器(Iterators)之MSDN解释
- 泛型编程之迭代器 Iterators
- 迭代器(Iterators)
- C++ 迭代器(Iterators)
- Iterators (迭代器)
- c++迭代器iterators
- c++ 变长参数的作为参数
- Android Content Providers(二)——Contacts Provider
- 常用的颜色RGB值
- 数据库联接总结
- Maven : 将Jar安装到本地仓库和Jar上传到私服
- STL迭代器之迭代器适配器:Reverse Iterators
- maven的继承与聚合
- oracle 查询慢的原因总结
- ngCordova配置安装
- Git & Gerrit 使用中遇到的问题
- 如何用Eclipse正确导入开源库AndroidStaggeredGrid
- 物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
- Android Content Providers(三)——Contacts Provider
- STL迭代器值迭代器绑定器:Insert Iterators