关联式容器用法汇总

关联式容器用法汇总

  • 感谢OI Wiki
  • set家族

set是一种关联容器,主要实现对插入的键值进行排序去重操作。可以实现插入、删除、查找等操作,十分实用。因为内部是由红黑树写成,它的复杂度相对平衡,兼顾各种操作,但是内部的键值不可修改。

set的定义十分简单,直接set<变量类型>集合名称;定义即可。

例如:set>s;。

它的迭代器经常用到的有两个:s.begin()(表示第一个元素的位置)、s.end()(表示最后一个元素之后的位置,注意这里没有任何元素)。

查找操作是set的主要有点,具体用法见下表。

格式

作用

s.count(x)

返回在s中x的个数

s.find(x)

返回s中x出现的迭代器(若未出现返回s.end())

s.lower_bound(x)

返回s中第一个大于等于x的数的迭代器(若均小于x返回s.end())

s.upper_bound(x)

返回s中第一个大于x的数的迭代器(若均小于等于x返回s.end())

s.empty()

返回s是否为空集合

s.size()

返回s内元素数量

……

……

需要注意的是lower_bound和upper_bound的时间代价,如果使用set内置的函数,代价为log级别,但是如果使用algorithm里给定的函数来查找set内部的元素,总代价是线性的。

插入删除元素用到的函数也不难记,见下表。

格式

作用

s.insert(x)

在s中没有其他x出现时将x插入到s中

s.erase(x)

把s中所有键值为x的元素清除

s.clear()

清空s

……

……

如果只想排序不想去重就需要用到multiset,它的用法和set基本相同。

  • map家族

map的使用方法与数组类似,也是由key到value的映射,在底层对所有key进行排序存储。插入、删除、查找的操作代价均为log级别,但是常数有亿点点大。

在map中,value的类型可以是任何你能想到的(short、int、unsigned int、long、unsigned long、long long、unsigned long long、__int128、char、bool、string、vector、pair、stack、queue、set、map、任何结构体、……),而key的类型只要定义过小于号运算符即可。

定义格式与set类似:mapmap名称。

例如:map>>mp;。(在多数情况下不会这么复杂,这里只是告诉大家什么类型都可以)

给个简单点的:map>m;。

当然,map中每一组对印关系的key都不会相同。

插入操作:同数组,例如m[“syz”]={1,“yyds”}。

清空操作:m.clear(),将整个容器清空。

查找操作:和set基本相同。

unordered_map就是在底层不对key进行排序(用哈希实现,容易被hack)。

你可能感兴趣的:(stl)