目录

一、关联式容器

二、set的介绍

1、接口count与容器multiset

2、接口lower_bound和upper_bound

三、map的介绍

1、接口insert

2、接口insert和operator[]和at

3、容器multimap

四、map和set相关OJ

1、前K个高频单词

2、两个数组的交集


一、关联式容器

vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。

而关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。 (插入删除只需挪动指针指向,无需挪动数据,查找时间logN)

关联式容器有两种,一种是map、set、multimap、multiset采用树形结构,他们的底层都是红黑树,另一种是哈希结构。

二、set的介绍

1、set是关联式容器,它表面上只存放value,实际底层中存放的是由<value,value>组成的键值对。

2、set调用find将采用中序遍历,可以用于排序+去重。

3、为了保证元素的唯一性,set中的元素均为const,所以并不能对元素进行修改,但可以进行插入删除。

1、接口count与容器multiset

count和find的作用一样,都是用于查找set中是否存在某个元素。

其实count是为了容器multiset设计的,该容器允许插入重复的元素,此时count会返回红黑树中被搜索元素的个数。

#include <iostream>
#include <set>int main ()
{std::set<int> myset;// set some initial values:for (int i=1; i<5; ++i) myset.insert(i*3);    // set: 3 6 9 12for (int i=0; i<10; ++i){std::cout << i;if (myset.count(i)!=0)std::cout << " is an element of myset.\n";elsestd::cout << " is not an element of myset.\n";}return 0;
}

2、接口lower_bound和upper_bound

lower_bound返回大于等于目标值的迭代器,upper_bound返回大于目标值的迭代器,在set中用于返回目标值的迭代器。(比如找到两个边界的迭代器,就可以使用erase对数据进行删除)

#include <iostream>
#include <map>int main ()
{std::map<char,int> mymap;std::map<char,int>::iterator itlow,itup;mymap['a']=20;mymap['b']=40;mymap['c']=60;mymap['d']=80;mymap['e']=100;itlow=mymap.lower_bound ('b');  // itlow points to bitup=mymap.upper_bound ('d');   // itup points to e (not d!)mymap.erase(itlow,itup);        // a => 20  e => 100// print content:for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)std::cout << it->first << " => " << it->second << '\n';return 0;
}

三、map的介绍

map是关联式容器,根据特定的存储顺序,用于存储由键值及其映射值组合的元素。

可以看到Alloc中有一个键值对pair,这个pair是一个key/value结构的struct模板类。这个类将一对键值耦合在一起,所以,map的存储方式是通过在搜索二叉树中存储键值对pair,而搜索二叉树的k/v模型是在节点中存储key和value,并不相同。pair的结构:

template <class T1, class T2>
struct pair
{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair(): first(T1()), second(T2()){}pair(const T1& a, const T2& b): first(a), second(b){}
};

1、接口insert

make_pair是一个函数模板:

template <class T1,class T2>
pair<T1,T2> make_pair (T1 x, T2 y)
{return ( pair<T1,T2>(x,y) );
}

2、接口insert和operator[]和at

使用map统计每个字符出现个数

写法2的[]详解:

Value& operator[] (const Key& k)
{pair<iterator,bool> ret=insert(make_pair(k,Value() ) );//在结构体pair中找到first(一个map的迭代器),->解引用找到该迭代器的pair,再找该pair的second(即value)return ret.first->second;
}
//map的insert
pair<iterator,bool> insert (const value_type& pair);
//插入
dict["迭代器"];//在dict中找不到"迭代器"这个key,将新增一个节点,该节点的key为"迭代器",value为value类型的默认构造
//修改
dict["迭代器"]="iterator";//将key为"迭代器"的节点的value修改为"iterator"

不难看出map的operator[]兼具查找、插入、修改三种功能。(注意如果搜寻值不在map中,map可是会帮你新增一个节点的,map底层的红黑树将发生改变)

使用operator[],编译器会去调用insert(pair<const key,value()>)进行插入,如果没有找到key所对应的节点,则会新增一个节点并将该节点中pair的value置为value类型的默认构造;如果找到了,则返回该节点pair中value的引用。(可读可写)

at的功能和[]一样,区别在于用at找不到key将不会发生插入新节点,而是抛出异常。

3、容器multimap

multimap多个键值对中的key可以重复,所以并没有operator[]。同样的,使用find将返回中序遍历找到的第一个key值所处节点的迭代器。

四、map和set相关OJ

1、前K个高频单词

struct Compare
{bool operator()(const pair<int,string>& a,const pair<int,string>& b){return a.first>b.first || (a.first==b.first&&a.second<b.second);}
};
class Solution {
public:vector<string> topKFrequent(vector<string>& words, int k) {vector<string> ret;map<string,int> dataMap;for(const auto& str : words){dataMap[str]++;}vector<pair<int,string>> v;for(auto& kv : dataMap){v.push_back(make_pair(kv.second,kv.first));//dataMap的first是string,second是int}sort(v.begin(),v.end(),Compare());for(int i=0;i<k;++i){ret.push_back(v[i].second);}return ret;}
};

2、两个数组的交集

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {set<int> s1(nums1.begin(),nums1.end());//nums1排序+去重    set<int> s2(nums2.begin(),nums2.end());//nums2排序+去重vector<int> ret;for(auto& e : s1){if(s2.find(e)!=s2.end()){ret.push_back(e);}}return ret;}
};

或者将两个数组排序+去重完毕后,使用双指针求解。(可用于找交集,差集)

【C++】set/multiset、map/multimap的使用相关推荐

  1. 【C++】set/multiset/map/multimap

    文章目录 一.set/multiset (集合) 1 set概念(自动排序.底层红黑树) 2 set构造和赋值(默认.拷贝.=赋值) 3 set大小和交换(size.empty.swap) 4 set ...

  2. stl的set,multiset, map, multimap, deque, list, stack, queue, priority_queue

    set实际上是平衡二叉树,需要声明头文件#include<set> Insert:将元素插入集合中 使用前向迭代器对集合中序遍历 使用反向迭代器reverse_iterator可以反向遍历 ...

  3. C++ STL 容器的一些总结 --- set(multiset)和map(multimap)

    1 set和multiset 1.1 插入元素方式 set只能用insert插入数据. insert返回值是一个pair<iterator, bool>, 即插入数据的迭代器以及是否插入成 ...

  4. set/multiset/unordered_set和map/multimap/unordered_map基础汇总

    引言 在STL中,有两种很常见的关联容器,分别是set和map,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的.所以关联容器经常用在关键字的查找中,效 ...

  5. STL容器及其简单应用(stack、priority_queue、vector、deuqe、list、map/multimap、set/multiset)

    目录 前言 [1]stack操作以及应用 stack的几个核心接口 利用stack完成进制转换 [2]priority_queue操作以及应用 priority_queue的几个核心接口 利用prio ...

  6. 6-6-3:STL之map和set——multiset和multimap及set和map在oj题中的用处

    文章目录 一:multiset和multimap (1)multiset (2)multimap 二:set和map在题目中的使用 (1)最喜欢吃的水果 (2)前k个高频单词 一:multiset和m ...

  7. 【C++】【第六篇-2】【黑马 p215~p242】【list容器】【set/multiset容器】【map/multimap容器】【函数对象】【谓词】【内建函数对象】

    [C++][第六篇-2][黑马 p215~p242][list容器][set/multiset容器][map/multimap容器][函数对象][谓词][内建函数对象] 3.7 list容器(p215 ...

  8. STL详解(十)—— set、map、multiset、multimap的介绍及使用

    文章目录 关联式容器 树形结构与哈希结构 键值对 set set的介绍 set的定义方式 set的使用 multiset map map的介绍 map的定义方式 map的插入 map的查找 map的删 ...

  9. C++ STL容器 —— map/multimap 用法详解

    C++ STL容器 -- map/multimap 用法详解 写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理.但别 ...

  10. C++STL的map/ multimap容器

    3.9.1 map基本概念 简介: map中所有元素都是pair pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值) 所有元素都会根据元素的键值自动排序 本质: map ...

最新文章

  1. 联想一体机电源键不亮_联想电脑一体机B505拆机经验
  2. 网站如何进行渠道跟踪_网站如何进行搜索引擎优化?
  3. 【请收藏】自动化构建部署之Travis CI使用(GitHub/Travis CI/Vue)
  4. 理解 Delphi 的类(十) - 深入方法[27] - 递归函数: 简单示例
  5. 你真会用setTimeout吗?
  6. 主机管理+堡垒机系统开发:前端批量命令结果(十二)
  7. 从头认识java-16.4 nio的读与写(ByteBuffer的使用)
  8. VPP使用心得(一)初步安装
  9. 清吧音响怎么选?看看这个黄金搭配,跟着买就对了
  10. dell笔记本重装win10系统超详细的教程(适用所有windows系统的一套流程)
  11. 手绘计算机比赛海报,手绘海报大赛 | 匠心
  12. 最全的“四大天王”合影集(绝对经典…
  13. Stream Collectors - filtering
  14. Python调用Gurobi:Assignment Problem(指派问题)简单案例
  15. 申请https证书的过程
  16. 《卡拉马佐夫兄弟》:道德权威
  17. 【训练题22:线性求逆元】【模板】乘法逆元 | 洛谷 P3811
  18. java 打印佛祖保佑
  19. SQLite实用武器库(1)利用dump命令和read命令导出数据、导入数据
  20. MySQL常见高可用方案

热门文章

  1. 常数变易法_打印图形
  2. 协方差,协方差矩阵,矩阵特征值
  3. C/C++ 技术面试基础知识总结
  4. CMSIS-DSP的arm_mat_init_f32矩阵求逆函数结果不对问题解决方法
  5. 手打css 问号提示-用于输入框,标题后面...
  6. iOS-长按识别二维码/生成二维码/扫描二维码
  7. [精]Oracle 内存结构详解
  8. 空前绝后!PostgresConf.CNPGConf.Asia 2020大会闭幕
  9. 人大金仓再次荣获“国家鼓励的重点软件企业”认定
  10. Linux 固件子系统----如何更新固件