带你详细了解C++中的map(键值对)和set(集合)

带你详细了解C++中的map(键值对)和set(集合)

C++学习:map集合(键值对)

集合(set)与映射(map)属于非线性结构容器类

内部实现上面是平衡二叉树    

map是STL的一个关联性容器,它提供一对一的数据处理能力

其中第一个可以称为关键字,每个关键字只能在map中出现一次
第二个称为该关键字的值

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

###set集合

begin 语法:

iterator begin();

返回指向当前集合中第一个元素的迭代器。

clear 语法:

void clear();

清除当前集合中的所有元素。

count 语法:

size_type count( const key_type &key );

返回当前集合中出现的某个值的元素的数目。

empty 语法:

bool empty();

如果当前集合为空,返回true;否则返回false。

end 语法:

const_iterator end();

返回指向当前集合中最后一个元素的迭代器。

equal_range 语法:

pair equal_range( const key_type &key );

返回集合中与给定值相等的上下限的两个迭代器。

erase 语法:

void erase( iterator i ); void erase( iterator start, iterator end ); size_type erase( const key_type &key );

说明:
● 删除i元素;
● 删除从start开始到end结束的元素;
● 删除等于key值的所有元素(返回被删除的元素的个数)。

find 语法:

iterator find( const key_type &key );

在当前集合中查找等于key值的元素,并返回指向该元素的迭代器;如果没有找到,返回指向集合最后一个元素的迭代器。

get_allocator 语法:

allocator_type get_allocator();

返回当前集合的分配器。

insert 语法:

iterator insert( iterator i, const TYPE &val ); void insert( input_iterator start, input_iterator end ); pair insert( const TYPE &val );

说明:
● 在迭代器i前插入val;
● 将迭代器start开始到end结束返回内的元素插入到集合中;
● 在当前集合中插入val元素,并返回指向该元素的迭代器和一个布尔值来说明val是否成功的被插入了。
(应该注意的是在集合(Sets)中不能插入两个相同的元素。)

lower_bound 语法:

iterator lower_bound( const key_type &key );

返回一个指向大于或者等于key值的第一个元素的迭代器。

key_comp 语法:

key_compare key_comp();

返回一个用于元素间值比较的函数对象。

max_size 语法:

size_type max_size();

返回当前集合能容纳元素的最大限值。

rbegin 语法:

reverse_iterator rbegin();

返回指向当前集合中最后一个元素的反向迭代器。

rend 语法:

reverse_iterator rend();

返回指向集合中第一个元素的反向迭代器。

size 语法:

size_type size();

返回当前集合中元素的数目。

swap 语法:

void swap( set &object );

交换当前集合和object集合中的元素。

upper_bound 语法:

iterator upper_bound( const key_type &key );

在当前集合中返回一个指向大于Key值的元素的迭代器。

value_comp 语法:

value_compare value_comp();

返回一个用于比较元素间的值的函数对象

简单的示例代码:

/* * =========================================================================== * *       Filename:  setTest.cpp *    Description:   *        Version:  1.0 *        Created:  2017年07月01日 22时20分58秒 *       Revision:  none *       Compiler:  gcc *         Author:   (),  *        Company:   * * =========================================================================== */#include#includeusing namespace::std;void showSet(const set i_set){  //通过迭代器的形式输出set集合  cout<<"===========the show start==========="<<endl;  set::const_iterator c_iter;  for(c_iter = i_set.begin(); c_iter !=i_set.end();c_iter++){    cout<< "i_set:"<<*c_iter << endl;  }  cout<<"===========the show end============="<<endl;}void showReverseSet(set r_set){  cout<<"==========the show reverse set start============="<<endl;  //通过反向迭代器输出  set::reverse_iterator r_iter;  for(r_iter = r_set.rbegin();r_iter!=r_set.rend();r_iter++){    cout<< "r_set:"<< *r_iter <<endl;  }  cout<<"==========the show reverse set end==============="<<endl;}int main(int argc,char *argv[]){  //set的常用几种构造函数  int array[6] = {11,3,25,7,9,6};  //第一种构造函数  set first_set;  //第二种构造函数  set second_set(array,array+6);  showSet(second_set);  //第三种构造函数  set third_set(second_set.begin(),second_set.end());  showSet(third_set);  //set的插入insert函数  first_set.insert(3);  first_set.insert(6);  first_set.insert(5);  first_set.insert(5);  showSet(first_set);  //返回当前集合中出现某个值的数量count  int count = first_set.count(5);  cout<< "the count:"<< count << endl;  //返回当前集合是否是null的  empty函数  bool setIsEmpty = first_set.empty();  cout << "the set empty type:"<<setIsEmpty <<endl;  //删除某个元素  erase  first_set.erase(3);  showSet(first_set);  //set的大小  cout<<"the set size:"<< first_set.size() << endl;    showReverseSet(first_set);  //交换集合中的元素  first_set.swap(second_set);  showSet(first_set);  showSet(second_set);    //通过find函数来寻找集合中的元素  set::iterator iter;  iter = first_set.find(3);  first_set.erase(iter);  showSet(first_set);  first_set.clear();  return 0;}

###map键值对的使用
C++ Maps
C++ Maps 被用作储存“关键字/值”对

begin 语法:

  iterator begin();

begin()函数返回一个迭代器指向map的第一个元素。

clear 语法:

void clear();

clear()函数删除map中的所有元素。

count 语法:

  size_type count( const KEY_TYPE &key );

count()函数返回map中键值等于key的元素的个数。

empty 语法:

  bool empty();

empty()函数返回真(true)如果map为空,否则返回假(false)。

end 语法:

  iterator end();

end()函数返回一个迭代器指向map的尾部。

equal_range Syntax:

  pair equal_range( const KEY_TYPE &key );

equal_range()函数返回两个迭代器——一个指向第一个键值为key的元素,另一个指向最后一个键值为key的元素。

erase 语法:

  void erase( iterator pos );  void erase( iterator start, iterator end );  size_type erase( const KEY_TYPE &key );

erase()函数删除在pos位置的元素,或者删除在start和end之间的元素,或者删除那些值为key的所有元素。

find 语法:

  iterator find( const KEY_TYPE &key );

find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。

get_allocator 语法:

  allocator_type get_allocator();

get_allocator()函数返回map的配置器。

insert 语法:

  iterator insert( iterator pos, const pair &val );  void insert( input_iterator start, input_iterator end );  pair insert( const pair &val );

insert()函数:
插入val到pos的后面,然后返回一个指向这个元素的迭代器。
插入start到end的元素到map中。
只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值。

key_comp 语法:

  key_compare key_comp();

key_comp()函数返回一个比较key的函数。

lower_bound 语法:

  iterator lower_bound( const KEY_TYPE &key );

lower_bound()函数返回一个迭代器,指向map中键值>=key的第一个元素。

max_size 语法:

  size_type max_size();

max_size()函数返回map能够保存的最大元素个数。

rbegin 语法:

  reverse_iterator rbegin();

rbegin()函数返回一个指向map尾部的逆向迭代器。

rend 语法:

  reverse_iterator rend();

rend()函数返回一个指向map头部的逆向迭代器。

size 语法:

  size_type size();

size()函数返回map中保存的元素个数。

swap 语法:

  void swap( map &obj );

swap()交换obj和现map中的元素。

upper_bound 语法:

  iterator upper_bound( const KEY_TYPE &key );

upper_bound()函数返回一个迭代器,指向map中键值>key的第一个元素。

value_comp 语法:

  value_compare value_comp();

value_comp()函数返回一个比较元素value的函数。

map集合的一些简单的使用

#include#include#includeusing namespace::std;/* * *map集合的简单使用 * * */class Compare{  public:    bool operator()(int a,int b){      return a > b;    }};int main(int argc,char* argv[]){  //定义一个map的对象  map num_convert_map;  map::iterator m_iter;  //采用pair来进行键值对的添加  num_convert_map.insert(pair(1,"one"));  //通过map集合内部的value_type来进行插入键值对  num_convert_map.insert(map::value_type(2,"two"));  //通过make_pair来进行键值对的插入  num_convert_map.insert(make_pair(3,"three"));  //map重载了[],[键] = "值"  num_convert_map[0] = "zero";  //输出map中的元素  for(m_iter =num_convert_map.begin();m_iter != num_convert_map.end() ;m_iter++){    //第一个元素iter->first  第二个元素 iter->second    cout <first <<":"< second << endl;  }  //通过键来查询值  cout<<num_convert_map[3]<<endl;    map string_map;  string_map.insert(pair("张三","初中"));  string_map["李四"] = "高中";  //由此重写后的map对象的[]运算符是支持泛型的  cout << string_map["张三"]<<endl;    //输出map的大小  cout<< "map size:" << num_convert_map.size() <<endl;    //通过Compare将map排序,通过赋值拷贝的构造函数  map num_convert_map2(num_convert_map.begin(),num_convert_map.end());  num_convert_map2.insert(pair(5,"张三"));    num_convert_map2.insert(pair(3,"李四"));    num_convert_map2.insert(pair(1,"赵柳"));    cout<< "-------------"<<endl;  for(m_iter = num_convert_map2.begin();m_iter != num_convert_map2.end();m_iter++){    cout<first <<";"<second<<endl;  }  return 0;}

感谢大家的阅读,希望大家收益多多。

本文转自:  https://blog.csdn.net/qq_29924041/article/details/74080102  

推荐教程:《C语言》                               

以上就是带你详细了解C++中的map(键值对)和set(集合)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1434295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
strcmp在c语言中是什么意思?
上一篇 2025年12月17日 09:50:44
c语言中strstr函数的用法是什么?
下一篇 2025年12月17日 09:50:54

相关推荐

  • 如何为VSCode配置C++开发环境?

    答案:配置VSCode的C++环境需安装MinGW-w64编译器并添加到PATH,安装C/C++和可选Code Runner扩展,创建.c_cpp_properties.json、tasks.json和launch.json文件以配置编译器路径、编译任务和调试设置,最后通过编译运行测试代码验证配置成…

    2026年9月20日
    100
  • VSCode的侧边栏图标代表什么?

    资源管理器(文件夹图标)用于管理项目文件结构,支持新建、重命名、删除和拖拽操作;2. 搜索(放大镜图标)实现全局文本查找与替换,支持正则表达式及范围筛选;3. 源代码管理(分支图标)集成Git功能,可查看变更、提交代码并同步远程仓库;4. 运行和调试(虫子图标)支持断点调试、变量监控及多语言启动配置…

    2026年9月20日
    000
  • Linux如何将进程放入后台运行

    将Linux进程放入后台运行主要有四种方法:使用&amp;amp;amp;amp;amp;amp;amp;符号在启动时放入后台;通过Ctrl+Z暂停后用bg继续运行;结合nohup与&amp;amp;amp;amp;amp;amp;amp;防止会话关闭导致终止;使用screen或tm…

    2026年9月20日
    000
  • 怎样在VSCode中重命名变量或文件?

    使用F2键可快速重命名变量或文件,VSCode会自动更新符号引用,支持多语言,重命名文件时需注意导入路径可能需手动调整。 在 VSCode 中重命名变量或文件非常方便,可以通过内置的重构功能快速完成,同时保持代码的一致性。 重命名变量(符号重命名) 当你想重命名代码中的变量、函数或类时,VSCode…

    2026年9月20日
    000
  • 在Java中如何使用computeIfAbsent构建Map

    computeIfAbsent用于键不存在时计算并放入值,支持单层、嵌套及多级Map构建,避免null判断,提升代码简洁性与线程安全,适用于ConcurrentHashMap,常用于分组、缓存等场景。 在Java中,computeIfAbsent 是 Map 接口提供的一个非常实用的方法,用于在键不…

    2026年9月20日
    000
  • OpenBSD 7.8 发布

    OpenBSD 7.8 正式推出,作为该项目的第 59 个发行版本,带来了多项重要更新与功能增强。主要变更包括: 初步加入对 Raspberry Pi 5 的支持 [详见此前报道]引入全新的分析子系统 [参见此前介绍]TCP 输入层现具备并行处理能力 [参见此前消息]并行 TCP 输入机制已完成性能…

    2026年9月13日
    100
  • 当IntelliSense反应迟钝时,如何调整相关设置或重建工作区索引?

    重建索引并优化设置可解决IntelliSense反应迟钝:启用自动完成、参数提示和语法错误高亮;2. 通过重置IntelliSense数据库、删除.ipch文件夹重建索引;3. 调整C_Cpp.intelliSenseEngine为Default或Tag Parser,设置缓存大小及排除监控目录以提…

    2026年9月12日
    200
  • 如何为VSCode配置自动补全(Auto Complete)?

    VSCode默认启用自动补全,通过LSP提供智能建议,可手动触发或设置自动弹出;2. 安装Pylance、Rust Analyzer等语言扩展提升各语言补全准确性;3. 调整editor.quickSuggestions、延迟时间和参数提示优化体验。 VSCode 的自动补全功能默认已启用,大多数情…

    2026年9月12日
    300
  • VSCode CCS文件怎么使用_VSCode编辑和编译CCS文件配置教程

    答案:通过配置VSCode的C/C++扩展和tasks.json文件,可实现对CCS项目的高效编辑与编译。具体需安装C/C++扩展,配置c_cpp_properties.json以设置头文件路径、宏定义和编译器路径,确保代码补全与智能感知正常;再通过tasks.json调用CCS的gmake工具执行…

    2026年9月12日
    200
  • 除了内置的终端,VSCode有哪些插件能极大提升命令行的工作效率?

    Code Runner可一键运行多语言代码并显示结果,适合快速测试;2. Terminal Tabs通过标签页管理多个终端会话,支持重命名和快捷切换;3. Shell Command允许对文件或选中文本执行自定义shell命令,提升重复操作效率;4. Task Explorer可视化运行项目脚本,自…

    2026年9月12日
    100
  • Java中全局数组与变量的声明及前缀和算法的优化实践

    在java中,可以通过将变量或数组声明为类的`static`成员来实现类似“全局”的访问效果。然而,出于代码可维护性、线程安全性和设计模式的考虑,通常不推荐过度使用全局状态。本文将通过一个前缀和算法的实例,详细讲解如何在java中声明类静态成员,并重点探讨如何通过参数传递和函数返回值来优化代码结构,…

    2026年9月12日
    100
  • Java中全局变量与数组的声明、使用及最佳实践

    在java中,可以通过将变量或数组声明为类的`static`成员来实现类似“全局”的访问效果。然而,为确保代码的可维护性、可测试性及线程安全,强烈建议最小化全局状态的使用,并优先采用局部变量和方法参数传递数据。本文将详细阐述其声明方式、相关最佳实践及通过前缀和数组案例进行优化演示。 1. Java中…

    2026年9月12日
    000
  • Java中声明和管理类静态成员(“全局”变量)的最佳实践

    本文深入探讨了在java中通过static关键字声明类静态成员(常被称为“全局”变量或数组)的方法。文章强调了在设计时应尽量减少对全局状态的依赖,以提升代码的可维护性、可测试性和线程安全性。通过一个前缀和计算的示例,展示了如何优化代码结构,优先使用局部变量和函数返回值,从而避免共享可变状态带来的潜在…

    2026年9月12日
    100
  • 腾讯元宝AI智能体验入口 腾讯元宝网页版便捷入口

    腾讯元宝AI智能体验入口为https://yuanbao.tencent.com,用户可通过该网页使用其文档处理、智能创作辅助及多模态交互功能,支持文件上传解析、AI生成PPT与图像、代码运行、拍题答疑等高效便捷服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月11日
    100
  • 如何为VSCode配置代码折叠策略?

    VSCode可通过设置自定义代码折叠行为。1. 将Editor: Folding Strategy设为indentation可启用基于缩进的折叠,适用于Python等无明确语法块的语言。2. 关闭Editor: Show Folds Decorations可隐藏折叠图标,减少视觉干扰。3. 使用#r…

    2026年9月11日
    400
  • 我是如何学习Android源码的

    大家好,又见面了,我是你们的老朋友全栈君。 连续很长一段时间(从2017年6月9日到2017年6月26日),我一直在研究蓝牙技术,这还不包括撰写和整理文章的时间。不知不觉中,这段研究已经持续了这么久……我已经写了三篇关于蓝牙的长篇博客,如下所示: 在这里就不放文章链接了,有需要的可以在我的文章中搜索…

    2026年9月11日
    200
  • Swoole如何做性能分析?分析工具有哪些?

    Swoole性能分析需结合内置监控与外部工具,先通过SwooleServer::stats()和系统监控定位异常,再用perf、strace或Blackfire等工具深入分析CPU、内存、I/O瓶颈,尤其关注协程阻塞与隐性同步操作,最后通过火焰图可视化热点,迭代优化并验证效果。 Swoole的性能分…

    2026年9月11日
    200
  • VSCode的Debug Adapter Protocol(DAP)是如何实现跨语言统一调试体验的?

    VSCode通过DAP协议与语言-specific调试器解耦,实现跨语言统一调试:1. DAP定义标准JSON-RPC消息格式,支持启动、断点、单步等操作;2. 各语言实现Debug Adapter,将DAP请求转为本地调试器调用;3. VSCode仅需对接DAP,无需理解后端细节,确保UI一致性和…

    2026年9月11日
    100
  • 如何为VSCode设置代码折叠区域?

    在VSCode中可通过#region和#endregion注释创建可折叠代码块,支持JavaScript、Python等多种语言,使用// #region 描述信息标记开始,// #endregion标记结束,不同语言注释符号略有差异,可嵌套命名区域以提升代码可读性,无需插件即可生效。 在 VSCo…

    2026年9月11日
    200
  • iPhone 11 Pro无法更新系统怎么办

    iPhone 11 Pro无法更新系统时,先检查Wi-Fi连接并重启设备;确保有足够的存储空间,删除旧更新文件后重试;若仍失败,可通过电脑使用iTunes或Finder进行有线更新,此方法可靠性高。 iPhone 11 Pro 无法更新系统,通常和网络、存储空间或系统临时故障有关。直接尝试在手机上通…

    2026年9月11日
    100

发表回复

登录后才能评论
关注微信