set类 & map类
这里先写上所有 \(STL\) 容器共有函数
复杂度都为常数
-
a.empty()
判空,空返回 \(1\),否则为 \(0\)。
-
a.size()
返回元素个数。
-
swap(a,b) || a.swap(b)
交换 \(a,b\),要求 \(a,b\) 同一类型。
以下内容容器适配器没有:
-
a.begin() || a.cbegin()
返回指向第一个元素的迭代器。
-
a.end() || a.cend()
返回指向最后一个元素下一个的迭代器。
\(set,multiset\&unordered\_set,unordered\_multiset\)
unordered_multiset
不做详细介绍,类比 multiset
和 unordered_set
可知。
定义
-
set<T,cmp> a
\(a\) 有序,\(T\) 为类型,\(cmp\) 是仿函数(比较函数)默认是
less<T>
,\(a\) 中元素不重复。 -
multiset<T,cmp> a
\(a\) 有序,\(T\) 为类型,\(cmp\) 是仿函数(比较函数)默认是
less<T>
,\(a\) 中元素可以重复。 -
unordered_set<T,hh> a
\(a\) 无序,\(T\) 为类型,\(hh\) 是哈希函数,默认是
hash<T>
,\(a\) 中元素不重复。
初始化
这里以 set
为例,multiset
和 unordered_set
类似。
-
set<T,cmp> a{k1,k2,k3,...,kn}
将 \(k1,k2,k3,...,kn\) 初始化入 \(a\) 中。
-
set<T,cmp> a(b)
将 \(b\) 拷贝进 \(a\),要求 \(a,b\) 类型一致。
-
set<T,cmp> a(bg,ed)
将 \([bg,ed)\) 拷贝进 \(a\),\(bg,ed\) 为迭代器。
插入
-
a.insert(x)
插入一个值 \(x\)。
-
a.insert(bg,ed)
插入 \([bg,ed)\) 里的所有数,\(bg,ed\) 为迭代器。
-
a.insert({x1,x2,x3,...,xn})
插入 \(x1,x2,x3,...,xn\) 。
删除
-
a.erase(pos)
删除 \(pos\) 位置元素,\(pos\) 为迭代器。
-
a.erase(x)
删除所有等于 \(x\) 的数。
-
a.erase(bg,ed)
删除 \(a\) 中在 \([bg,ed)\) 的数,\(bg,ed\) 为迭代器。
-
a.clear()
清空 \(a\)。
查找
-
a.count(x)
返回 \(a\) 中等于 \(x\) 的个数,在
set
中只为 \(0,1\)。 -
a.find(x)
返回指向 \(a\) 中等于 \(x\) 的数的一个迭代器,如果没找见,返回
a.end()
。 -
a.lower_bound(x)
返回指向 \(a\) 中第一个大于 \(x\) 的数的迭代器。
-
a.upper_bound(x)
返回指向 \(a\) 中第一个大于等于 \(x\) 的数的迭代器。
注 :
\(3\) 和 \(4\) 都是基于二分查找的算法,所以对于 unordered_set
不适用。
如果用 algorithm
的算法,复杂度则是 \(\mathrm O(n)\) 。
复杂度
set
和 multiset
除了 a.count(x)
都是 \(\mathrm O (\log n)\)
set
的 a.count(x)
是 \(\mathrm O (\log n)\),但 multiset
是 \(\mathrm O (\log n) + k\) 的,其中 \(k\) 是相同元素个数。
unordered_set
理论都是 \(\mathrm O (1)\),但可能被卡成 \(\mathrm O (n)\)(因为基于哈希。
\(map,multimap\&unordered\_map,unordered\_multimap\)
unordered_multimap
不做详细介绍,类比 multimap
和 unordered_map
可知。
定义:
-
map<Tk,Tv,cmp> a
\(a\) 有序,按键大小排序,\(Tk\) 为键类型,\(Tv\) 为值类型,\(cmp\) 是仿函数(比较函数)默认是
less<Tk>
,\(a\) 中同一个键只对应一个值。 -
multimap<Tk,Tv,cmp> a
\(a\) 有序,按键大小排序,\(Tk\) 为键类型,\(Tv\) 为值类型,\(cmp\) 是仿函数(比较函数)默认是
less<Tk>
,\(a\) 中同一个键可对应多个值。 -
unordered_set<Tk,Tv,hh> a
\(a\) 无序,\(Tk\) 为键类型,\(Tv\) 为值类型,\(hh\) 是哈希函数,默认是
hash<Tk>
,\(a\) 中同一个键只对应一个值。
初始化
这里以 map
为例,multiset
和 unordered_set
类似。
-
map<Tk,Tv,cmp> a{{k1,v1},{k2,v2},{k3,v3},...,{kn,vn}}
将 \(k1:v1,k2:v2,k3:v3,...,kn:vn\) 初始化入 \(a\) 中,\(k\) 是键,\(v\) 是值。
等同于
map<Tk,Tv,cmp> a{make_pair(k1,v1),...,make_pair(kn,vn)}
和
map<Tk,Tv,cmp> a{pair<Tk,Tv>{k1,v1},...,pair<Tk,Tv>{kn,vn}}
-
map<Tk,Tv,cmp> a(b)
将 \(b\) 拷贝进 \(a\),要求 \(a,b\) 类型一致。
-
map<Tk,Tv,cmp> a(bg,ed)
将 \([bg,ed)\) 拷贝进 \(a\),\(bg,ed\) 为迭代器。
查询:
multimap
没有通过键查询的操作,因为一个键对应多个值。
-
a.at(k)
返回 \(a\) 中键 \(k\) 对应的值,如果未找到,返回异常:
out_of_range
。 -
a[k]
返回 \(a\) 中键 \(k\) 对应的值,如果未找到,就添加键 \(k\),值为 \(0\)。
插入:
-
a.insert({k,v})
插入一对键值,分别为 \(k:v\)。
类似初始化,也可用
make_pair()
和pair<Tk,Tv>{}
。如果键重复,就会插入失败,不会覆盖。
-
a.insert(bg,ed)
插入 \([bg,ed)\) 里的所有键和值,\(bg,ed\) 为迭代器。
如果键重复,就会插入失败,不会覆盖。
-
a.insert({{k1,v1},{k2,v2},...,{kn,vn}})
插入 \(n\) 对键值,分别为 \(k1:v1,k2:v2,...,kn:vn\),其中 \(ki\) 对应 \(vi\)。
类似初始化,也可用
make_pair()
和pair<Tk,Tv>{}
。如果键重复,就会插入失败,不会覆盖。
-
a[k]=v
插入一对键值,分别为 \(k:v\)。
如果键重复,会覆盖 当前键所对应的值。
multimap
也不支持这种插入。
删除:
-
a.erase(pos)
删除 \(pos\) 位置元素,\(pos\) 为迭代器。
-
a.erase(k)
删除所有键等于 \(k\) 的数。
-
a.erase(bg,ed)
删除 \(a\) 中在 \([bg,ed)\) 的数,\(bg,ed\) 为迭代器。
-
a.clear()
清空 \(a\)。
查找:
-
a.count(k)
返回 \(a\) 中键等于 \(k\) 的个数,在
map
中只为 \(0,1\)。 -
a.find(k)
返回指向 \(a\) 中键等于 \(k\) 的数的一个迭代器,如果没找见,返回
a.end()
。 -
a.lower_bound(k)
返回指向 \(a\) 中第一个键大于 \(k\) 的数的迭代器。
-
a.upper_bound(k)
返回指向 \(a\) 中第一个键大于等于 \(k\) 的数的迭代器。
注 :
\(3\) 和 \(4\) 都是基于二分查找的算法,所以对于 unordered_map
不适用。
如果用 algorithm
的算法,复杂度则是 \(\mathrm O(n)\) 。
复杂度
map
和 multimap
除了 a.count(x)
都是 \(\mathrm O (\log n)\)
map
的 a.count(x)
是 \(\mathrm O (\log n)\),但 multimap
是 \(\mathrm O (\log n) + k\) 的,其中 \(k\) 是相同元素个数。
unordered_map
理论都是 \(\mathrm O (1)\),但可能被卡成 \(\mathrm O (n)\)(因为基于哈希。
本文来自博客园,作者:xrlong,转载请注明原文链接:https://www.cnblogs.com/xrlong/articles/17237744.html
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。