这两天把剩下的stl看完了,然后看了一些经典例题,
1.set和multiset
两者的区别就在于set中的元素只能出现一次,multiset中的元素可以重复出现
头文件是
定义:set <data_type> set_name;
如:set s;//默认由小到大排序
set和multiset的搜寻操作函数
s.size() | 集合中元素的数目 |
s.begin() | 返回指向第一个元素的迭代器 |
s.end() | 返回一个双向迭代器,指向最后一个元素的下一个位置 |
s.empty() | 返回容器是否为空。 |
s.count(elem) | 返回“元素值为elem”的元素个数 |
s.find(elem) | 返回“元素值为elem”的第一个元素,如果找不到就返回end() |
s.lower_bound(elem) | 返回elem的第一个可安插位置,也就是“元素值>=elem”的第一个位置 |
s.upper_bound(elem)) | 返回elem的第一个可安插位置,也就是“元素值>=elem”的第一个位置 |
s.equal_range(elem) | 返回elem可安插的第一个位置和最后一个位置 |
s.equal_range() | 将lower_bound()和upper_bound()的返回值做个一个pair返回。 |
s.insert(elem) | 安插一个elem副本,返回新元素位置 |
s.erase(elem) | |
s.erase(pos) | 移除迭代器pos所指位置上的元素,无返回值。 |
s.clear() | 移除全部元素,将整个容器清空。 |
2.map和multimap
头文件是
map <data_type1, data_type2> map_name;
如:map <string, int> m;//默认按string由小到大排序
map和set的区别是前者是一对,后者是一个的,map是映射,一一对应。
map不允许修改元素的键值,允许修改元素的实值。
m.size() | 返回容器大小 |
m.empty() | 返回容器是否为空 |
m.count(key) | 返回键值等于key的元素的个数 |
m.lower_bound(key) | 返回键值等于key的元素的第一个可安插的位置 |
m.upper_bound(key) | 返回键值等于key的元素的最后一个可安 插的位置 |
m.begin() | 返回一个双向迭代器,指向第一个元素。 |
m.end() | 返回一个双向迭代器,指向最后一个元素的下一个位置。 |
m.clear() | 讲整个容器清空。 |
m.erase(elem) | 移除键值为elem的所有元素,返回个数,对 于map来说非0即1。 |
m.erase(pos) | 移除迭代器pos所指位置上的元素。直接元素存取: |
m[key] = value | 查找的时候如果没有键值为key的元素,则安插一个键值为key的新元素,实值为默认(一般0)。 |
m.insert(elem) | 插入一个元素elema)运用value_type插入 |
3.优先队列(priority_queue)
头文件:
定义:priority_queue <data_type> priority_queue_name;
如:priority_queue q;//默认是大顶堆
q.push(elem) | 将元素elem置入优先队列 |
q.top() | 返回优先队列的下一个元素 |
q.pop() | 移除一个元素 |
q.size() | 返回队列中元素的个数 |
q.empty() | 返回优先队列是否为空 |
优先队列是个二叉树排序,并不是线性的
对于这个排序先放入5,再放入2,放入6,6比5大,和5交换位置,放入7,7比2大,和2交换位置,比6大,和6交换位置,再放入1,4。
然后就是同一行的左边比右边小。的厨排序后的序列是321567