「学习笔记」set、map、auto
快 NOIP 了,最近的考试中用到了很多 STL其实也就今天的考试用到了,其中 set
与 map
以及简单的指针的使用也慢慢熟悉了
map
对于 Hash 来说,这是个好东西,但是它也不能完全代替掉 Hash,因为它的操作是带 \(\log\) 的,其次,它也会对元素进行排序
定义
map<string, int> mp;
插入
mp["IOI AK ME"] = 1;
这就是最常用的,此外他还有 erase()
、upper_bound()
、lower_bound()
、count()
、find()
、empty()
、size()
等函数,其中 find()
函数就是判断该元素是否出现过,empty()
判断是否为空,size()
返回容器大小,count(x)
返回元素个数
set
set
是关联容器,内部通常采用红黑树实现,非常适合处理需要同时兼顾查找、插入与删除的情况。和数学中的集合相似,set
中不会出现值相同的元素。
操作
insert(x)
: 当容器中没有等价元素的时候,将元素 \(x\) 插入到 set
中。
erase(x)
: 删除值为 \(x\) 的所有元素,返回删除元素的个数。
erase(pos)
: 删除迭代器为 \(pos\) 的元素,要求迭代器必须合法。
erase(first,last)
: 删除迭代器在 \([first - last)\) 范围内的所有元素。
clear()
: 清空 set
。
count(x)
: 返回 set
内键为 \(x\) 的元素数量。
find(x)
: 在 set
内存在键为 \(x\) 的元素时会返回该元素的迭代器,否则返回 end()
。
lower_bound(x)
: 返回指向首个不小于给定键的元素的迭代器。如果不存在这样的元素,返回 end()
。
upper_bound(x)
: 返回指向首个大于给定键的元素的迭代器。如果不存在这样的元素,返回 end()
。
empty()
: 返回容器是否为空。
size()
: 返回容器内元素个数。
auto
这是一个便利的迭代器定义,但可惜只能在 C++ 14 及更新的版本中用,速度更慢,但可以充当各种各样的迭代器。
对于 pair
定义的元素(就拿 vector
为例),可以这样用:
vector<pair<int, int> > son
for (auto [it, i] : son) {
cout << it << endl;
}