C++map与set的介绍与使用
Posted 可乐不解渴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++map与set的介绍与使用相关的知识,希望对你有一定的参考价值。
等风来,不如追风去。
set与multiset
set与multiset的介绍
set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要O(logN)的时间复杂度即可完成,效率比较高。
set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列。而multiset中的元素可以不是唯一的,其他的功能与set相同。
set与multiset的定义方式
set的构造函数原型:
set (const key_compare& comp = key_compare(), const allocator_type& alloc =allocator_type())
multiset的构造函数原型:
multiset (const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());
常用定义方式:
1、set / multiset<类型名称>变量名
set<string>st
multiset<int>mt;
2、set / multiset<类型名称,仿函数>变量名
set<int,greater<int>>st
multiset<int,less<int>>mt;
3、set / multiset<类型名称>变量名(起始位置,结束元素的下一个位置)
int arr[5]=0,1,2,3,4;
vector<int>Arr=5,6,7,8,9;
set<int>mt(arr,arr+5);
set<int>st(Arr.begin(),Arr.end());
multiset<int>mt(arr,arr+5);
multiset<int>st(Arr.begin(),Arr.end());
set与multiset常用操作
函数名 | 函数声明 | 功能 |
---|---|---|
insert() | pair<iterator,bool> insert (const value_type& val); | 插入元素到set/multiset容器中(根据搜索树的规则插入) |
erase() | void erase ( iterator position); | 删除position位置上的元素 |
clear() | void clear(); | 将容器中的元素清空 |
swap() | void swap (set& x); | 交换两个容器中的元素 |
size() | size_type size() const; | 得到该容器中元素的个数 |
empty() | bool empty() const; | 检测容器中的元素是否为空,为空返回true,否则返回false |
find() | iterator find (const value_type& val) const; | 查找该容器中是否有该元素,有返回该元素的迭代器,没有返回 set::end()或者 multiset::end() |
迭代器
根据上面的定义后,我们可以创建一个set/multiset的对象,如set<int>s;
常用的迭代器如下:
begin()
返回值: 返回set/multiset容器中第一个元素,即中序遍历的第一个元素。
end()
返回值: 返回set/multiset容器中最后一个元素的下一个位置,即中序遍历的最后一个元素的下一个位置(可以简单的看成是nullptr)。
set/multiset的区别
唯一区别:set不允许有相同的元素插入(相当于进行了去重的效果),而multiset允许有相同的元素插入。
如下所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>
using namespace std;
int main()
set<int>s;
multiset<int>mt;
s.insert(3);
s.insert(3);
mt.insert(3);
mt.insert(3);
return 0;
注意:
- 在set与multiset中找某个元素,时间复杂度为O(logN)
- set与multiset其底层结构使用的二叉搜索树(红黑树)。
map与multimap
map与multimap的介绍
map与multimap是STL的一个关联容器,它提供一对一的hash。
- 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
- 第二个可能称为该关键字的值(value);
map/multimap的区别
唯一区别:map不允许有相同的元素插入(相当于进行了去重的效果),而multimap允许有相同的元素插入。这一点与set与multiset特点相同。
map与multimap的操作与set与multiset大部分函数功能相同,具体可以参考上面的set,但map有一个专属的 operator[] 重载。我们可以使用 [ ] 来进行插入元素。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>
using namespace std;
int main()
map<string,string>mp;
mp["student"] = "学生";
mp.insert(make_pair("sort", "排序"));
return 0;
operator[]的原理是:
用<key, T()>构造一个键值对,然后调用insert()函数将该键值对插入到map中,如果key已经存在,则插入失败,insert函数返回该key所在位置的迭代器; 如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器。insert函数返回的是一个pair类型,该类型第一个成员是map类型的迭代器,第二个成员是bool类型用来判断是否插入成功。
operator[]函数最后将insert返回值键值对中的value返回。
map/multimap与set/multiset这四个容器的底层实现使用的都是红黑树。
其插入、删除操作的时间复杂度都为O(logN),且这些容器都不能修改 。
以上是关于C++map与set的介绍与使用的主要内容,如果未能解决你的问题,请参考以下文章