STL 逆向迭代器 reverse_iterator 的逻辑位置与实际位置

对于逆向迭代器,很重要的一点是需要弄清楚逻辑位置和实际位置二者的区别。

下图显示了逆向迭代器的位置和所指的数值:

可以发现,逆向迭代器所指位置(实际位置)和所代表的的数值(逻辑位置或数值)是不同的。C++这么做是有其原因的。导致这个行为的原因是区间的半开性。为了能够制定容器内的所有元素,我们必须运用最后一个元素的下一个位置。但是对于reverse迭代器而言,这个位置位于第一个元素之前。这时候问题就出现了,这个位置也许并不存在,因为容器并不要求其第一个元素之前的位置合法。

因此,逆向迭代器运用了一个小技巧:实际上倒置了“半开原则”,即逆向迭代器所定义的区间不包括起点,而包括终点。但是逻辑上一如常态。这样就导致了逆向迭代器实际所指的元素位置和逻辑上所指的元素位置就不一致。

测试代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 int main()
{
    vector<int> coll;  

    //insert elements from 1 to 9
    for (int i=1; i<=9; ++i) {
         coll.push_back(i);
    }  

    //find position of element with value 5
    vector<int>::iterator pos;
    pos = find (coll.begin(), coll.end(),
                5);  

    //print value to which iterator pos refers
    cout << "pos: " << *pos << endl;  

    //convert iterator to reverse iterator rpos
    vector<int>::reverse_iterator rpos(pos);  

    //print value to which reverse iterator rpos refers
    cout << "rpos: " << *rpos <<endl;
}  

结果:

pos: 5

rpos: 4

原理如下图:

时间: 2024-10-07 05:19:13

STL 逆向迭代器 reverse_iterator 的逻辑位置与实际位置的相关文章

C++学习之路: STL探索之 reverse_iterator 的一个小陷阱

1 2.reverse迭代器 2 a) 在逻辑上,rbegin指向最后一个元素,rend指向第一个元素的前一个位置. 3 b) 但是在实际实现上,rbegin指向最后一个元素的下一个位置,rend指向第一个元素. 4 c) reverse迭代器的物理位置与逻辑位置差1 5 d) 逻辑值比物理位置减少了1. 引言: vector<int> vec 我们push_back是十个数   it 0  1  2  3  4  5  6  7  8  9 r_it 我们用 vector<int>

STL之迭代器(iterator)

1 头文件 所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件.不过有几种特别的迭代器,例如逆向迭代器,被定义于<iterator>中. 2 迭代器类型 迭代器共分为五种,分别为: Input iterator.Output iterator.Forward iterator.Bidirectional iterator.Random access iterator. 2.1 Input(输入)迭代器 只能一次一个向前读取

带你深入理解STL之迭代器和Traits技法

在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (int i = 0 ; i < n ; i++) { sum += *a++; } return sum; } //对于listNode类的求和函数 struct ListNode { int val; ListNode * next; }; int sum(ListNode * head) { int

STL的迭代器和类型萃取

今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于是就有了STL的两大部分,容器(container)和泛型算法(algorithms),泛型算法有很多参数都是迭代器. 举一个栗子!泛型算法find()的实现! 1 template<class InputIterator, class T> 2 InputIterator find(InputI

android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索

最近跟着百度地图API学地图开发,先是学了路径搜索,对于已知坐标的两点进行驾车.公交.步行三种路径的搜索(公交路径运行没效果,待学习中),后来又 学了定位功能,能够获取到自己所在位置的经纬度,但当将两者合起来先自动获取自己所在位置的经纬度然后与固定地点进行路径搜索时却弄不出来了,因为刚开始 写的两者在两个类中总是取不到经纬度值,后来将两者写到同一个类中去了,终于取到经纬度值了,也运行出来了.需要 在 BDLocationListener的onReceiveLocation里获取到经纬度值,因为已

手机模拟位置实现精准位置营销效果分析

对微商来说,实现位置精准营销实在太重要的一个推广方法了,位置精准营销能让你的产品展示到全世界的人身边,大大增加产品的曝光度,同时也能打造好友数量,做圈内营销,这里分享一种我们经常在用的位置精准营销方法供大家参考. 我们知道位置营销一般都基于社交软件app或者分类信息软件上来做,通过模拟位置定位让账号在不同的地方出现,我们开始进入主题,如何实现位置精准营销的步骤,首先手机上安装琢石模拟器,一键生成参数,然后在把位置定位修改一下我们的要模拟的位置,然后打开我们要模拟的app,当然前提是把我们的签名信

javascript获取textarea中所选文本的开始位置、结束位置和选择的文本

javascript获取textarea中所选文本的开始位置.结束位置和选择的文本. demo: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>javascript获取textarea中所选文本的开始位置.结束位置和选择的文本</title

位置无关码 位置相关码

在汇编中  使用位置无关码 b,bl 在c语言中 使用位置无关码 不用全局变量  不用静态变量 位置无关码:CPU取指时,总是相对于本条执行指令的相对地址去取指.比如指行一个ADD指令时,PC要取下一指令的地址,就在原来的基础上+4.这就不管你代码放在存储器的任何位置,只要他们的相对地址没有改变,就能正常执行程序.一般上电复位那几条语句就必须是位置无关码指令. 位置相关码:可以这样来说,就是CPU每次取指都从绝对位置去取,而不是上面的相对位置.这个绝对地址就是相对起始地址0来说的.这样,就要求你

求最大子数组的和,以及求该最大子数组的起始位置和末尾位置

问题描述: 一个数组,长度为N,数组元素有负有正,如{-1, 4, 6, -3, 7, -3, -3, 9}:我们可以清楚的知道最大的子数组应该是4到9,也就是下标1到下标7,和为17. 求解思路: 第一种方法:我们可以用定义1.两个数ThisSum和MaxSum来记录当前数组的和,以及数组的最大和. 2.我们可以用两个for循环来来遍历数组,每一次求出子数组的最大和,每个子数组从0开始,下一次遍历子数组就是从1开始,以此类推.如第一次就[0~N-1]的最大和,第二次就是[1~N-1],第三次就