STL迭代器之迭代器适配器:Reverse Iterators

本文深入探讨了迭代器适配器中的ReverseIterators概念,解释了其如何通过反转操作符的行为来实现元素的逆序处理。通过实例展示了如何在容器操作中使用ReverseIterators,并解析了逆向迭代器与正向迭代器之间的区别,特别是关于指向位置的解释。此外,文章还介绍了ReverseIterators如何与deque容器结合使用,以及如何将其转换回正向迭代器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器适配器:
这些特殊的迭代器允许算法在反转,插入,流中操作。
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() 就行了。
在IT领域,尤其是地理信息系统(GIS)中,坐标转换是一项关键技术。本文将深入探讨百度坐标系、火星坐标系和WGS84坐标系之间的相互转换,并介绍如何使用相关工具进行批量转换。 首先,我们需要了解这三种坐标系的基本概念。WGS84坐标系,即“World Geodetic System 1984”,是一种全球通用的地球坐标系统,广泛应用于GPS定位和地图服务。它以地球椭球模型为基础,以地球质心为原点,是国际航空和航海的主要参考坐标系。百度坐标系(BD-09)是百度地图使用的坐标系。为了保护隐私和安全,百度对WGS84坐标进行了偏移处理,导致其与WGS84坐标存在差异。火星坐标系(GCJ-02)是中国国家测绘局采用的坐标系,同样对WGS84坐标进行了加密处理,以防止未经授权的精确位置获取。 坐标转换的目的是确保不同坐标系下的地理位置数据能够准确对应。在GIS应用中,通常通过特定的算法实现转换,如双线性内插法或四参数转换法。一些“坐标转换小工具”可以批量转换百度坐标、火星坐标与WGS84坐标。这些工具可能包含样本文件(如org_xy_格式参考.csv),用于提供原始坐标数据,其中包含需要转换的经纬度信息。此外,工具通常会附带使用指南(如重要说明用前必读.txt和readme.txt),说明输入数据格式、转换步骤及可能的精度问题等。x86和x64目录则可能包含适用于32位和64位操作系统的软件或库文件。 在使用这些工具时,用户需要注意以下几点:确保输入的坐标数据准确无误,包括经纬度顺序和浮点数精度;按照工具要求正确组织数据,遵循读写规则;注意转换精度,不同的转换方法可能会产生微小误差;在批量转换时,检查每个坐标是否成功转换,避免个别错误数据影响整体结果。 坐标转换是GIS领域的基础操作,对于地图服务、导航系统和地理数据分析等至关重要。理解不同坐标系的特点和转换方法,有助于我们更好地处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值