迭代器(iterator)与逆向迭代器(reverse_iterator)的转换

本文介绍如何在C++中将迭代器转换为逆向迭代器,并演示了逆向迭代器转回普通迭代器的方法。通过示例代码展示了在list容器中查找元素并进行正向与逆向迭代的过程。

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

迭代器(iterator)转逆向迭代器(reverse_iterator),只需要把迭代器转入逆向迭代器的构造函数即可;逆向迭代器转迭代器,调用逆向迭代器的base成员函数即可。

int main()
{
	list<int> coll;
	for(int i = 1; i <= 9; ++i)
		coll.push_back(i);
	
	list<int>::iterator itPos;
	itPos = find(coll.begin(), coll.end(), 5);
	cout << "pos: " << *itPos << endl;
	
	list<int>::reverse_iterator rpos(itPos);
	cout << "rpos: " << *rpos << endl;
	
	list<int>::iterator ritPos;
	ritPos = rpos.base();
	cout << "rrpos: " << *ritPos << endl;

	return 0;
}




                
### C++ 中 `deque` 容器的迭代器用法 在 C++ 的标准模板库(STL)中,`deque` 是一种双端队列容器,支持高效的头部和尾部插入/删除操作。其迭代器的行为类似于随机访问迭代器,允许通过索引快速定位元素。 以下是关于 `deque` 迭代器的具体使用方法及其示例: #### 1. 声明初始化 可以声明一个 `deque<int>::iterator` 类型来遍历整数类型的 `deque`[^2]。如果不需要修改元素,则可使用 `const_iterator` 来增强安全性。 ```cpp #include <iostream> #include <deque> using namespace std; void printDeque(const deque<int> &d) { for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it) { cout << *it << " "; } cout << endl; } int main() { deque<int> dq; // 向 deque 尾部添加元素 for(int i = 0; i < 5; ++i){ dq.push_back(i); } // 使用 const_iterator 遍历并打印 printDeque(dq); return 0; } ``` 上述代码展示了如何定义一个函数 `printDeque` 并利用 `const_iterator` 对 `deque` 进行只读访问。 --- #### 2. 修改元素 当需要修改 `deque` 中的元素时,应使用普通的 `iterator` 而不是 `const_iterator`。 ```cpp #include <iostream> #include <deque> using namespace std; int main(){ deque<int> dq = {1, 2, 3, 4, 5}; // 获取指向第一个元素的迭代器 deque<int>::iterator it = dq.begin(); // 修改第一个元素为 100 *it = 100; // 打印修改后的结果 for(it = dq.begin(); it != dq.end(); ++it){ cout << *it << " "; } cout << endl; return 0; } ``` 此代码片段演示了如何通过解引用迭代器来更改 `deque` 中存储的值[^1]。 --- #### 3. 双向迭代 由于 `deque` 支持双向迭代器特性,因此可以从头到尾或者从尾到头遍历整个容器。 ```cpp #include <iostream> #include <deque> using namespace std; int main(){ deque<int> dq = {10, 20, 30, 40, 50}; // 正向遍历 cout << "Forward iteration: "; for(auto it = dq.begin(); it != dq.end(); ++it){ cout << *it << " "; } cout << endl; // 反向遍历 cout << "Reverse iteration: "; for(auto rit = dq.rbegin(); rit != dq.rend(); ++rit){ cout << *rit << " "; } cout << endl; return 0; } ``` 这段程序说明了正向 (`begin()` 到 `end()`) 和反向 (`rbegin()` 到 `rend()`) 遍历的方式[^3]。 --- #### 4. 插入删除中的迭代器失效问题 需要注意的是,在对 `deque` 进行动态调整(如插入或删除元素)时,可能会导致已存在的迭代器失效。这是因为底层实现可能涉及内存重新分配。 ```cpp #include <iostream> #include <deque> using namespace std; int main(){ deque<int> dq = {1, 2, 3, 4, 5}; auto it = dq.begin(); // 在迭代器所指位置前插入新元素 dq.insert(it, 100); // 输出新的序列 for(auto iter = dq.begin(); iter != dq.end(); ++iter){ cout << *iter << " "; } cout << endl; return 0; } ``` 在此情况下,原始迭代器 `it` 已经不再有效,需谨慎处理此类场景。 --- ### 总结 以上介绍了 `deque` 容器中迭代器的基础用法以及一些注意事项。无论是基本的遍历还是复杂的动态操作,掌握这些技巧对于高效编程至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值