STL— set
转自:
https://www.cnblogs.com/xenny/p/9362743.html
https://www.cnblogs.com/isChenJY/p/11535335.html
1,性质
set 遵循数学集合三特性,无重复、无序性、确定性
其中,set 中内置红黑树进行排序,所以插入删除效率很高。
2,基操
int a[] = {1,2,3,4,5}; set<int>q; q.insert(x); //集合中插入元素 q.insert(a,a+5); //插入数组a至a+5的元素 q.find(x); //返回x值位置的迭代器,找不到返回q.end() q.erase(iter); //删除集合中的元素 q.size(); //返回当前set容器中的元素个数 q.count(); //返回某个值元素的个数(根据set的特性,就是判断这个元素在不在,返回0或1) q.begin(); //返回头位置迭代器 q.end(); //返回尾位置迭代器 q.rbegin(); //返回尾部反向迭代器 q.rend(); //返回头部反向迭代器 q.clear(); //删除set容器中的所有的元素 q.empty(); //判断set容器是否为空 q.lower_bound(); //返回指向大于(或等于)某值的第一个元素的迭代器,如果value大于 [ begin, end) (半开区间)的任何一个元素,则返回 end q.upper_bound(); //返回大于某个值元素的迭代器
3,函数
insert(x):可将 x 插入 set 容器中,并自动递增排序和去重,时间复杂度O(logN)
5,排序与遍历
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<set> using namespace std; struct Edge { int to, w; }; struct cmp { bool operator() (const Edge &a, const Edge &b) const{ return a.to < b.to; } }; int main(void) { set<Edge, cmp>s; // 重写排序 s.insert({ 3, 5 }); s.insert({ 2, 6 }); s.insert({ 4, 7 }); s.insert({ 1, 8 }); for (auto it = s.begin(); it != s.end(); it++) { Edge vi = *it; int to = vi.to, w = vi.w; printf("%d\n", to); } system("pause"); return 0; }
========= ======== ======== ======= ====== ====== ==== === == =
定风波 苏轼 宋
三月七日,沙湖道中遇雨。雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词。
莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴