迭代器与反迭代器的问题

反迭代器转迭代器:

list<int> ::iterator r_aaaPosBase;

list<int> ::reverse_iterator r_aaaPos = aaa.rbegin();

此处为什么要--

同理,如果有list{1,2,3,4,5},反向迭代器的rend()函数,指向的是1左方的空白位置,与end类似。

此时假如aaaPos指向aaa.begin(),也就是1的位置,利用aaaPos初始化反迭代器r_aaaPos,

r_aaaPos指向的值为1左方的空白,也就是反迭代器的最后一个元素。所以--的作用也是为了对齐反迭代器与迭代器

如果aaaPos指向的是list.end(),insert后aaaPos和r_aaaPos都会指向插入的元素的位置

void reverse2Iterator()
{
	list<int> ::iterator aaaPos = aaa.begin();
	list<int> ::reverse_iterator r_aaaPos;
	aaaPos = aaa.insert(aaaPos, 20000);
	//此时为{1,2,3,4,5,20000}
	r_aaaPos = list<int> ::reverse_iterator(aaaPos);
	r_aaaPos--;
	PrintList();
	cout << "*aaaPos" << *aaaPos << endl;
	cout << "*r_aaaPos" << *r_aaaPos << endl;
	while (aaaPos == r_aaaPos.base())
	{
		cout << "*aaaPos" << *aaaPos << endl;
		cout << "*r_aaaPos" << *r_aaaPos << endl;
		break;
	}
}

r_aaaPos.base()相比单纯的r_aaaPos指向的位置,会更偏向尾部方向1个单位、

例如 1,2,3,4,5,r_aaaPos指向rbegin,也就是5的位置,r_aaaPos.base()会指向5后面一位,也就是普通迭代器指向的end()的位置

所有经过--后,即可对齐r_aaaPos.base()和反向迭代器r_aaaPos的位置。

通俗来讲,反向迭代器如果赋值为rbegin(),则他的base函数返回的是正向迭代器的end();中间指向的值相差了1位。

void reverse2Iterator2()
{
	list<int> ::iterator r_aaaPosBase;
	list<int> ::iterator aaaPos = aaa.begin();
	list<int> ::reverse_iterator r_aaaPos = aaa.rbegin();
	aaaPos = aaa.insert(aaaPos, 20000);
	//此时为{20000,1,2,3,4,5}
	PrintList();
	r_aaaPosBase = r_aaaPos.base();
	r_aaaPosBase--;
	cout << "*aaaPos" << *aaaPos << endl;
	cout << "*r_aaaPos" << *r_aaaPos << endl;
	cout << "*r_aaaPosBase" << *r_aaaPosBase << endl;
	
	while (aaaPos != r_aaaPosBase)//为偶数时永远不会指向同一位置。
	{
		aaaPos++;
		r_aaaPos++;
		r_aaaPosBase--;
		cout << "*aaaPos" << *aaaPos << endl;
		cout << "*r_aaaPos" << *r_aaaPos << endl;
		cout << "* r_aaaPosBase" << *r_aaaPosBase << endl;
		if (aaaPos == r_aaaPosBase)
		{
			break;
		}
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值