0

0

C++范围for循环怎样配合STL使用 现代遍历容器最佳实践

P粉602998670

P粉602998670

发布时间:2025-07-17 09:15:02

|

352人浏览过

|

来源于php中文网

原创

c++范围for循环简化了stl容器的遍历操作。1. 遍历vector时,只读访问可用int number : numbers,修改元素需用int& number : numbers;2. 遍历map时需使用std::pair,并推荐const auto& pair : ages以避免复制并防止修改;3. 范围for循环与stl算法结合可实现更复杂逻辑,如std::find_if查找满足条件的元素;4. 其局限包括无法在循环中删除元素或仅遍历部分元素,此时需使用迭代器,如通过it = numbers.erase(it)安全删除元素。总体而言,范围for循环应优先使用,特殊情况再选用迭代器。

C++范围for循环怎样配合STL使用 现代遍历容器最佳实践

C++范围for循环,也称为基于范围的for循环,是现代C++中遍历STL容器的首选方式。它简化了代码,提高了可读性,并且在大多数情况下,性能与手动迭代器相当甚至更好。简单来说,它就是个语法糖,让你的代码更优雅。

C++范围for循环怎样配合STL使用 现代遍历容器最佳实践

STL容器配合范围for循环,让遍历操作变得无比简单。

C++范围for循环怎样配合STL使用 现代遍历容器最佳实践

范围for循环遍历vector的正确姿势

vector可能是最常用的STL容器了。直接用范围for循环就能搞定:

立即学习C++免费学习笔记(深入)”;

#include <iostream>
#include <vector>

int main() {
  std::vector<int> numbers = {1, 2, 3, 4, 5};

  // 遍历vector并打印每个元素
  for (int number : numbers) {
    std::cout << number << " ";
  }
  std::cout << std::endl;

  // 修改vector中的元素(需要使用引用)
  for (int& number : numbers) {
    number *= 2;
  }

  // 再次遍历vector并打印修改后的元素
  for (int number : numbers) {
    std::cout << number << " ";
  }
  std::cout << std::endl;

  return 0;
}

这里,第一个循环是只读遍历,直接用int number即可。第二个循环要修改元素,必须使用int& number,也就是引用。如果你不想修改元素,但又不想复制,可以用const int& number

C++范围for循环怎样配合STL使用 现代遍历容器最佳实践

如何使用范围for循环遍历map并访问键值对

map的遍历稍微复杂一点,因为map存储的是键值对。你需要用到std::pair

#include <iostream>
#include <map>

int main() {
  std::map<std::string, int> ages = {
      {"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};

  // 遍历map并打印键值对
  for (const auto& pair : ages) {
    std::cout << pair.first << ": " << pair.second << std::endl;
  }

  return 0;
}

注意这里用了const auto& pairauto让编译器自动推断类型,const保证不修改map中的元素,&使用引用避免复制。pair.first是键,pair.second是值。

范围for循环与算法结合,效率更高

范围for循环不仅可以单独使用,还可以和STL算法结合,实现更复杂的操作。比如,查找vector中第一个大于10的元素:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
  std::vector<int> numbers = {5, 8, 12, 3, 15};

  auto it = std::find_if(numbers.begin(), numbers.end(),
                           [](int n) { return n > 10; });

  if (it != numbers.end()) {
    std::cout << "第一个大于10的元素是: " << *it << std::endl;
  } else {
    std::cout << "没有找到大于10的元素" << std::endl;
  }

  return 0;
}

虽然这里没有直接使用范围for循环,但是std::find_if使用了迭代器,而范围for循环本质上也是基于迭代器的。可以认为,范围for循环是std::for_each的语法糖版本。

范围for循环的局限性,以及替代方案

范围for循环虽然方便,但也有局限性。比如,它不能在循环过程中删除元素。如果你需要在循环中删除元素,必须使用迭代器:

#include <iostream>
#include <vector>

int main() {
  std::vector<int> numbers = {1, 2, 3, 4, 5};

  // 删除vector中所有的偶数
  for (auto it = numbers.begin(); it != numbers.end();) {
    if (*it % 2 == 0) {
      it = numbers.erase(it);
    } else {
      ++it;
    }
  }

  // 打印删除后的vector
  for (int number : numbers) {
    std::cout << number << " ";
  }
  std::cout << std::endl;

  return 0;
}

这里,numbers.erase(it)会返回下一个元素的迭代器,所以需要it = numbers.erase(it)。如果元素没有被删除,需要手动++it

另一个局限性是,范围for循环只能遍历容器中的所有元素,不能只遍历一部分。如果你需要遍历一部分元素,也需要使用迭代器。

总的来说,范围for循环是遍历STL容器的利器,但在某些特殊情况下,还是需要使用迭代器。选择哪种方式,取决于你的具体需求。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

612

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

334

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

40

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

1

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号