C++11 常用 for 循环
1. 范围 for 循环(range-based for)--- C++11 核心新特性
最常用,遍历容器元素最简洁:
cpp
// 只读访问
QVector<int> values = {1, 2, 3, 4, 5};
for (int v : values) {
qDebug() << v;
}
// 引用修改(推荐 auto &)
for (auto &v : values) {
v *= 2; // 修改原元素
}
// 只读引用,避免拷贝(适合大对象如 QString)
for (const auto &v : stringList) {
qDebug() << v;
}
2. 传统 for 循环 + auto
cpp
QList<QString> names = {"Alice", "Bob"};
for (auto i = 0; i < names.size(); ++i) {
qDebug() << names.at(i);
}
3. 迭代器 for 循环
cpp
// STL 迭代器风格
QMap<QString, int> scoreMap = {{"Alice", 90}, {"Bob", 85}};
for (auto it = scoreMap.begin(); it != scoreMap.end(); ++it) {
qDebug() << it.key() << it.value();
}
// 只读迭代器
for (auto it = scoreMap.cbegin(); it != scoreMap.cend(); ++it) {
qDebug() << it.key() << it.value();
}
4. 范围 for 遍历 QMap(C++17 结构化绑定更佳,C++11 用 auto)
cpp
// C++11 中 QMap 不能直接 range-for 取键值对
for (const QString &key : scoreMap.keys()) {
qDebug() << key << scoreMap.value(key);
}
选择建议
| 场景 | 推荐写法 |
|---|---|
| 遍历读元素 | for (const auto &e : container) |
| 遍历改元素 | for (auto &e : container) |
| 需要索引 | 传统 for + auto i |
| 需要键值对 | 迭代器 for (auto it = ...) |
关键原则 :能用 const auto & 就别用值拷贝 auto,对 QString、自定义结构体等大对象避免性能浪费。