一.简介
基本概念:
在 C++ 中,基于范围的 for 循环(Range-based for loop)是一种简化容器遍历的语法糖,适用于所有支持 begin()
和 end()
的容器(如 vector
、map
、array
等)。以下是其核心用法和注意事项:
语法:
for (元素声明 : 容器) {
// 操作元素
}
- 元素声明:可以是值、引用或常量引用(
const auto&
)。 - 容器:可以是数组、标准库容器(如
vector
、map
)或自定义迭代器的类。
使用示例:
#include <iostream>
#include <vector>
using namespace std;
template<class T>
void printV(const vector<T>& v){
for (const T& v1 : v)
{
cout << v1 << " ";
}
cout << endl;
}
int main()
{
vector<int> v1{1,2,3,4,5,6,7,8};
printV(v1);
return 0;
}
二.使用细节
1.关系型容器
例如map这种key->value的键值对。
/*
基于范围的for循环
*/
#include <iostream>
#include <vector>
#include <map>
using namespace std;
template<class T>
void printV(vector<T>& v){
for (T& v1 : v)
{
cout << v1 << " ";
}
cout << endl;
}
template<class T,class U>
void printM(map<T,U>& m)
{
for(auto& it : m){
//用fisrt访问key,second访问value
cout << "id:" << it.first << ",name:" << it.second << endl;
}
}
int main()
{
vector<int> v1{1,2,3,4,5,6,7,8};
printV(v1);
map<int,string> m;
m.insert({1,"liu"});//初始化列表
m.insert(make_pair(2,"wang"));
//emplace 直接在 map 内部构造键值对,避免临时对象的拷贝或移动,效率更高。
//特点:若键已存在,构造失败(不会覆盖原值)。
m.emplace(3,"ren");//C++11方法
//4. emplace_hint 方法(C++11 起)
//与 emplace 类似,但提供一个迭代器作为插入位置的提示,可能优化插入效率。
auto hint = m.begin(); // 初始提示位置
hint = m.emplace_hint(hint, 4, "liu");
hint = m.emplace_hint(hint, 5, "wang");
printM(m);
return 0;
}
2.注意事项
- 优先使用
const auto&
:避免不必要的拷贝。 - 使用
auto
代替显式类型:提高代码简洁性和可维护性。 - 遍历
map
时使用const
:因为map
的键是const
,避免意外修改。