C++迭代器常用三种遍历方法

本文探讨了C++中如何使用vector容器,通过迭代器实现元素的遍历,并介绍了for_each函数式编程的应用。通过实例展示了如何在vector中插入和打印整数,以及如何利用函数fun进行元素处理。

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

#include<iostream>
#include<vector>
#include<list>
#include<deque>
#include<iterator>
#include<algorithm>
using namespace std;

/*
int main()
{
	vector<int> V;
	V.push_back(10);
	V.push_back(20);
	V.push_back(30);
	V.push_back(40);
	vector<int>::iterator itBegin = V.begin();
	vector<int>::iterator itEnd = V.end();
	while (itBegin != itEnd)
	{
		cout << *itBegin << endl;
		itBegin++;
	}
	system("pasue");
}


*/
/*
int main()
{
	vector<int> V;
	V.push_back(10);
	V.push_back(20);
	V.push_back(30);
	V.push_back(40);
	for (vector<int>::iterator it = V.begin();it != V.end();it++)
		cout << *it << ' ';
	getchar();
}
*/

/*
void fun(int val)
{
	cout << val << ' ';
}

int main()
{
	vector<int> V;
	V.push_back(10);
	V.push_back(20);
	V.push_back(30);
	V.push_back(40);
	for_each(V.begin(), V.end(), fun);
	system("pause");
}
*/
### C++迭代器遍历与普通索引遍历的区别 #### 区别 在C++中,迭代器提供了一种通用的方法来访问容器中的元素,而不需要知道底层的数据结构实现细节。相比之下,普通的索引方式通常依赖于数组或字符串这样的连续内存布局。 - **灵活性**:迭代器可以用于任何标准库容器(如`vector`, `list`, `map`),甚至自定义容器;而索引仅适用于支持随机访问的容器,比如`std::array` 或者 `std::vector`[^1]。 - **安全性**:当使用迭代器时,如果容器发生变化(例如插入新元素),某些情况下可能会使现有的迭代器失效。但是,在多态环境中工作时,迭代器提供了更好的封装性和抽象层次,减少了直接暴露内部表示的风险。另一方面,基于下标的访问容易引发越界错误,除非程序员小心处理边界条件[^4]。 - **语法差异**:迭代器的操作更接近指针运算,允许前缀递增(`++it`)、解引用(`*it`)等操作;而对于简单的线性序列,则可以直接利用下标进行读写[^5]。 #### 性能对比 关于性能方面: - 对于像`std::vector`这样实现了动态数组的数据结构来说,两者之间几乎没有差别,因为它们都能够在常数时间内完成定位和检索任务[^2]。 - 不过对于链表式的关联容器(如`std::list`),由于其节点分布不连续,因此每次通过偏移量获取特定位置上的数据都需要O(n)的时间复杂度。此时采用迭代器会更为高效,因为它只需沿着链接前进即可到达目标项[^3]。 #### 使用场景建议 - 如果是在顺序存储且频繁执行随机存取的应用场合下,那么选择哪种方法影响不大; - 当面对非连续分配的空间或是需要跨平台移植性强的解决方案时,推荐优先考虑迭代器机制; - 需要注意的是,在涉及并发编程的情况下,应该特别留意如何安全地管理共享资源以及防止竞争状况的发生。 ```cpp // 迭代器遍历 vector 示例 #include <iostream> #include <vector> using namespace std; void iterator_traversal(const vector<int>& vec){ for(vector<int>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it){ cout << *it << " "; } } // 普通索引遍历 vector 示例 void index_traversal(const vector<int>& vec){ for(size_t idx = 0; idx < vec.size(); ++idx){ cout << vec[idx] << " "; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值