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 
#include 

int main() {
  std::vector 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 
#include 

int main() {
  std::map 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 
#include 
#include 

int main() {
  std::vector 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 
#include 

int main() {
  std::vector 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容器的利器,但在某些特殊情况下,还是需要使用迭代器。选择哪种方式,取决于你的具体需求。

相关专题

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

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

523

2023.09.20

string转int
string转int

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

315

2023.08.02

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

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

537

2024.08.29

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

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

52

2025.08.29

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

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

197

2025.08.29

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

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

75

2025.09.05

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

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

32

2025.11.16

golang map原理
golang map原理

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

59

2025.11.17

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

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

精品课程

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

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