文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中map和set如何使用

2023-07-05 05:30

关注

这篇文章主要介绍了C++中map和set如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中map和set如何使用文章都会有所收获,下面我们一起来看看吧。

一、set

1.1 set的介绍

C++中map和set如何使用

首先要知道set的底层是由红黑树(平衡二叉搜索树)实现的。

T set存放元素类型,底层是<value, value>的键值对。
Compare 仿函数,因为实现搜索树需要比较。

1.2 set的使用

1.2.1 set的构造
void test_set(){// 默认构造set<int> s1;// 迭代器区间构造int a[] = { 1, 2, 3, 4 };set<int> s2(a, a + 4);// 拷贝构造(深拷贝)set<int> s3(s2);for (int e : s2) cout << e << " ";cout << endl;for (int e : s3) cout << e << " ";cout << endl;}

C++中map和set如何使用

1.2.2 set的迭代器

C++中map和set如何使用

可以看到set有反向迭代器。

void test1(){set<int> s;// 排序+去重s.insert(1);s.insert(2);s.insert(3);s.insert(1);s.insert(3);s.insert(4);// 正向迭代器set<int>::iterator it1 = s.begin();while (it1 != s.end()){cout << *it1++ << " ";}cout << endl;// 反向迭代器set<int>::reverse_iterator it2 = s.rbegin();while (it2 != s.rend()){cout << *it2++ << " ";}cout << endl;}

C++中map和set如何使用

因为set的仿函数默认参数是less<T>,所以排的是升序,如果我们想排降序就可以传递greater<T>

void test1(){set<int, greater<int>> s;// 排序+去重s.insert(1);s.insert(2);s.insert(3);s.insert(1);s.insert(3);s.insert(4);// 正向迭代器set<int>::iterator it1 = s.begin();while (it1 != s.end()){cout << *it1++ << " ";}cout << endl;// 反向迭代器set<int>::reverse_iterator it2 = s.rbegin();while (it2 != s.rend()){cout << *it2++ << " ";}cout << endl;}

C++中map和set如何使用

1.2.3 set的修改

1.2.3.1 insert && find && erase

C++中map和set如何使用

C++中map和set如何使用

C++中map和set如何使用

void test2(){set<int> s;s.insert(1);s.insert(2);s.insert(3);s.insert(4);s.insert(5);set<int>::iterator it = s.find(3);s.erase(it);for (auto& e : s){cout << e << " ";}cout << endl;}

C++中map和set如何使用

1.2.3.2 count

C++中map和set如何使用

传进去一个元素数值,返回该元素的个数

void test2(){set<int> s;s.insert(1);s.insert(2);s.insert(3);s.insert(4);s.insert(5);cout << s.count(2) << endl;cout << s.count(6) << endl;}

C++中map和set如何使用

因为set的元素是唯一的,所以在set这里count可以用find来代替,但是在后面的multiset可以插入重复的元素,count就可以统计该元素的个数。

1.3 multiset

multiset和set的区别是它可以插入重复的元素。其他的接口跟set一致。头文件也跟set相同

void test3(){multiset<int> ms;ms.insert(1);ms.insert(1);ms.insert(2);ms.insert(3);ms.insert(4);for (auto& e : ms){cout << e << " ";}cout << endl;cout << "count(1): " << ms.count(1) << endl;}

C++中map和set如何使用

另外使用find查找时,如果有多个值相同,find返回的值是中序的第一个。

C++中map和set如何使用

二、map

2.1 map的介绍

C++中map和set如何使用

key 键值对中key的类型
T 键值对中value的类型

注意:

1️⃣ map中的元素总是按照键值key进行比较排序的。
2️⃣ map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。

2.2 map的使用

构造和迭代器跟上面的set类似,就不过多阐述。

2.2.1 map的修改

2.2.1.1 insert

C++中map和set如何使用

void test4(){map<string, int> m;m.insert(pair<string, int>("a", 1));// 匿名对象m.insert(make_pair("b", 2));// 简化写法m.insert(make_pair("c", 2));m.insert(make_pair("d", 2));map<string, int>::iterator it = m.begin();while (it != m.end()){cout << (*it).first << "->" << (*it).second << endl;it++;}}

C++中map和set如何使用

make_pair:函数模板,不需要像pair一样显示声明类型,而是通过传参自动推导。

C++中map和set如何使用

2.2.1.2 统计次数

1️⃣ 使用find,利用迭代器

int main(){string arr[] = { "北京", "武汉", "广州", "上海", "北京", "北京", "广州","上海", "上海" };map<string, int> cnt;for (auto& e : arr){map<string, int>::iterator fd = cnt.find(e);if (fd == cnt.end()){cnt.insert(make_pair(e, 1));}else{fd->second++;}}for (auto& e : cnt){cout << e.first << "->" << e.second << endl;}return 0;}

C++中map和set如何使用

2️⃣ 使用[]

int main(){string arr[] = { "北京", "武汉", "广州", "上海", "北京", "北京", "广州","上海", "上海" };map<string, int> cnt;for (auto& e : arr){cnt[e]++;}for (auto& e : cnt){cout << e.first << "->" << e.second << endl;}return 0;}

C++中map和set如何使用

[] 可以用来插入、修改、查找

[] -> (*((this->insert(make_pair(k,mapped_type()))).first)).second// 等价于V& operator[](const K& k){pair<iterator, bool> ret = insert(make_pair(k, V()));return ret.first->second;}

这里就可以看出使用[]的时候要注意:如果没有它会直接插入。

所以我们想插入就可以:

int main(){map<string, int> m;// 插入m["广西"];m["广东"] = 1;for (auto& e : m){cout << e.first << "->" << e.second << endl;}return 0;}

C++中map和set如何使用

当我们想要修改的时候不能用insert,因为只要key相同就会插入失败

int main(){map<string, int> m;// 插入m["广西"];m["广东"] = 1;m.insert(make_pair("广东", 2));// 插入失败for (auto& e : m){cout << e.first << "->" << e.second << endl;}return 0;}

C++中map和set如何使用

先要修改可以:

m["广东"] = 2;

key不在就是插入,key在就是查找。

2.3 multimap

int main(){multimap<string, int> mm;mm.insert(make_pair("北京", 1));mm.insert(make_pair("北京", 2));mm.insert(make_pair("北京", 1));mm.insert(make_pair("上海", 1));for (auto& e : mm){cout << e.first << "->" << e.second << endl;}return 0;}

multimap容器与map容器的底层实现以及成员函数的接口都是基本一致,而multimap的key可以重复注意multimap没有[]

C++中map和set如何使用

使用multimap统计次数:

int main(){multimap<string, int> mm;string arr[] = { "北京", "武汉", "广州", "上海", "北京", "北京", "广州","上海", "上海" };for (auto& e : arr){map<string, int>::iterator fd = mm.find(e);if (fd == mm.end()){mm.insert(make_pair(e, 1));}else{fd->second++;}}for (auto& e : mm){cout << e.first << "->" << e.second << endl;}return 0;}

C++中map和set如何使用

补充:set和map的区别

关于“C++中map和set如何使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++中map和set如何使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯