0

0

c++如何遍历set容器_c++ set容器迭代与遍历技巧

冰火之心

冰火之心

发布时间:2025-09-18 08:35:01

|

509人浏览过

|

来源于php中文网

原创

C++中遍历set主要使用迭代器,因set基于红黑树实现,元素有序且不支持下标访问;可通过正向迭代器、范围for循环或反向迭代器rbegin()/rend()进行遍历;遍历时删除元素需用erase返回的迭代器避免失效,但禁止直接修改元素值,否则破坏有序性;若需修改应先删后插;为提高效率可选用范围for循环,频繁增删场景可考虑unordered_set。

c++如何遍历set容器_c++ set容器迭代与遍历技巧

C++中遍历set容器,主要依赖迭代器。迭代器就像一个指针,指向set中的元素,允许你访问并移动到下一个元素。由于set是基于红黑树实现的,元素默认有序,遍历时会按照从小到大的顺序访问。

迭代器遍历是主要方式,但需要注意set不支持下标访问。

使用迭代器遍历set容器:

#include 
#include 

int main() {
  std::set mySet = {3, 1, 4, 1, 5, 9, 2, 6}; // set会自动去重和排序

  // 使用迭代器遍历
  std::cout << "使用迭代器遍历 set: ";
  for (std::set::iterator it = mySet.begin(); it != mySet.end(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;

  // 使用范围for循环(C++11及以上)
  std::cout << "使用范围for循环遍历 set: ";
  for (int element : mySet) {
    std::cout << element << " ";
  }
  std::cout << std::endl;

  // 使用 const_iterator 遍历 (当set是const时)
  const std::set constSet = {3, 1, 4};
  std::cout << "使用 const_iterator 遍历 const set: ";
  for (std::set::const_iterator it = constSet.begin(); it != constSet.end(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;

  return 0;
}

如何反向遍历set?

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

Set本身是有序的,有时候我们需要反向遍历,从最大的元素开始。

#include 
#include 

int main() {
  std::set mySet = {3, 1, 4, 1, 5, 9, 2, 6};

  // 使用反向迭代器
  std::cout << "反向遍历 set: ";
  for (std::set::reverse_iterator it = mySet.rbegin(); it != mySet.rend(); ++it) {
    std::cout << *it << " ";
  }
  std::cout << std::endl;

  return 0;
}

这里用到了

rbegin()
rend()
,它们分别返回指向set尾部(最后一个元素)的反向迭代器和指向set头部前一个位置的反向迭代器。注意,
++it
在反向迭代器中实际上是向前移动,即访问前一个元素。

遍历set时修改元素是否安全?

Background Eraser
Background Eraser

AI自动删除图片背景

下载

这是一个需要特别注意的问题。由于set的有序性是基于红黑树的,修改元素可能会破坏这种有序性。

  • 删除元素: 在遍历过程中删除元素是安全的,但需要小心迭代器的使用。删除当前迭代器指向的元素后,迭代器会失效。正确的做法是使用

    erase()
    方法的返回值更新迭代器。

    #include 
    #include 
    
    int main() {
      std::set mySet = {1, 2, 3, 4, 5};
    
      for (std::set::iterator it = mySet.begin(); it != mySet.end();) {
        if (*it % 2 == 0) { // 删除偶数
          it = mySet.erase(it); // erase返回下一个有效迭代器
        } else {
          ++it;
        }
      }
    
      std::cout << "删除偶数后的 set: ";
      for (int element : mySet) {
        std::cout << element << " ";
      }
      std::cout << std::endl;
    
      return 0;
    }
  • 修改元素值: 直接修改set中元素的值是绝对禁止的! 因为这会破坏set的有序性,导致未定义的行为。 如果你需要修改元素的值,正确的做法是:先删除该元素,然后插入修改后的新元素。 这个过程会触发set的重新排序。

    #include 
    #include 
    
    int main() {
      std::set mySet = {1, 2, 3, 4, 5};
    
      // 假设我们要把元素 3 修改为 30
    
      // 1. 查找要修改的元素
      std::set::iterator it = mySet.find(3);
    
      if (it != mySet.end()) {
        // 2. 删除原有元素
        mySet.erase(it);
    
        // 3. 插入新的元素
        mySet.insert(30);
      }
    
      std::cout << "修改元素后的 set: ";
      for (int element : mySet) {
        std::cout << element << " ";
      }
      std::cout << std::endl;
    
      return 0;
    }

为什么set不提供下标访问?

Set的设计目标是维护元素的唯一性和有序性,而不是像数组那样通过索引来快速访问元素。 红黑树的结构决定了查找特定元素的效率较高(O(log n)),但不支持随机访问。 如果需要下标访问,可以考虑使用

std::vector
std::map
等容器。
std::map
提供了键值对的存储,可以通过键来访问值,类似于字典。

如何提高set遍历的效率?

对于简单的遍历,使用范围for循环是最简洁高效的。 如果需要更复杂的操作,例如条件删除,则需要使用迭代器,并注意迭代器的有效性。 尽量避免在遍历过程中进行大量的插入和删除操作,因为这会影响set的性能。 如果需要频繁的插入和删除,可以考虑使用其他数据结构,例如

std::unordered_set
,它提供了平均常数时间的插入和删除操作,但元素是无序的。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

536

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

22

2026.01.06

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

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

75

2025.09.05

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

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

36

2025.11.16

golang map原理
golang map原理

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

60

2025.11.17

java判断map相关教程
java判断map相关教程

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

40

2025.11.27

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

html编辑相关教程合集
html编辑相关教程合集

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

53

2026.01.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.3万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.3万人学习

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

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