在C++中,遍历容器(如std::vector
、std::list
、std::map
等)的常用方式有多种。以下是一些主要的遍历方式:
1. 使用for循环和索引(下标遍历)
这是最基本的遍历方式,通过索引(或下标)来访问容器中的每个元素。适用于支持随机访问的容器,如std::vector
、std::deque
等。
std::vector<int> v = {1, 2, 3, 4, 5};
for (int i = 0; i < v.size(); ++i) {
std::cout << v[i] << " ";
}
2. 使用迭代器
迭代器提供了一种通用的方法来访问容器中的元素,它允许我们以统一的方式遍历不同类型的容器。迭代器遍历适用于所有STL容器。
std::vector<int> v = {1, 2, 3, 4, 5};
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
// 或者使用auto关键字简化迭代器类型
for (auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " ";
}
3. 使用C++11引入的范围for循环(基于范围的for循环)
范围for循环提供了一种更简洁的遍历容器的方式,它自动处理迭代器的细节。适用于所有支持迭代器的容器。
std::vector<int> v = {1, 2, 3, 4, 5};
for (const auto& elem : v) { // 使用const auto&避免不必要的拷贝,并且如果不需要修改元素,推荐使用const
std::cout << elem << " ";
}
4. 使用STL算法for_each
std::for_each
是STL中的一个算法,它可以对容器中的每个元素执行给定的函数。它需要包含头文件<algorithm>
。
#include <algorithm>
#include <vector>
#include <iostream>
void print(int n) {
std::cout << n << " ";
}
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
std::for_each(v.begin(), v.end(), print);
// 或者使用Lambda表达式
std::for_each(v.begin(), v.end(), [](int n) { std::cout << n << " "; });
return 0;
}
5. 使用C++17引入的结构化绑定(与遍历结合较少,但可用于解包元素)
虽然结构化绑定主要用于解包结构体、元组或pair等复合类型的元素,但在与遍历结合使用时,它主要用于解包容器中的元素对或更复杂的结构,而不是直接用于遍历容器。
总结
- 下标遍历:适用于支持随机访问的容器,如
std::vector
。 - 迭代器遍历:适用于所有STL容器,是最通用和灵活的遍历方式。
- 范围for循环:C++11引入,提供了一种更简洁的遍历方式,适用于所有支持迭代器的容器。
- STL算法for_each:对容器中的每个元素执行给定的函数,适用于需要执行特定操作的遍历场景。
在实际编程中,可以根据具体需求和容器类型选择最合适的遍历方式。