[关闭]
@attack666 2019-04-17T08:25:17.000000Z 字数 1634 阅读 2094

set与map

map

内部实现是一棵红黑树

key和value分别对应着两种类型

map<key, value> mp;

直观的理解就是一种加强的数组。

  1. begin()--返回指向第一个元素的迭代器
  2. end()--返回指向最后一个元素的迭代器
  3. find()--返回一个指向被查找到元素的迭代器
  4. size()--集合中元素的数目
  5. clear()--清除所有元素
  6. count()--返回某个值元素的个数
  7. empty()--如果集合为空,返回true
  8. lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
  9. upper_bound()--返回大于某个值元素的迭代器
  1. map<int, int>::iterator mit;
  2. //mit = mp.begin();
  3. mp[2] = 1;
  4. mp[5] = 3;
  5. //++ 把当前迭代器后移
  6. //-- 前移 找到比他小的"位置"
  7. for(mit = mp.begin(); mit != mp.end(); mit++) {
  8. //mit->second = 233;
  9. cout << mit->first << ' ' << mit->second << '\n';
  10. }
  11. for(auto &x: mp) {//&
  12. //x.second = 233;
  13. //考虑如果在这儿套一个二分的复杂度
  14. cout << x.first << ' ' << x.second << '\n';
  15. }
  16. for(auto x = mp.begin(); x != mp.end(); x++) {
  17. cout << x->first << ' ' << x->second << '\n';
  18. }
  1. #include<tr1/unordered_map>

MingW/4.8.1/include/c++/ext/pb_ds

set

link

  1. begin();//返回的是第一个元素的迭代器
  2. end();
  3. insert(x);//pair<set<int>::iterator, bool>> second = 0说明已经有该元素/否则成功插入
  4. size();
  5. find(x);//若能找到返回迭代器,否则返回end()
  6. count(x);//出现次数,因为set的性质,所以只有0/1
  7. lower_bound(x);//>=x的iterator
  8. upper_bound(x);//>x的iterator
  9. erase(x);//删除x。

关于遍历时使用erase函数的问题

  1. #include<bits/stdc++.h>
  2. #include<tr1/unordered_map>
  3. using namespace std;
  4. set<int> s;
  5. //本质上是一个集合
  6. //集合中的元素互不相同
  7. set<int>::iterator sit;
  8. int main() {
  9. s.insert(2);
  10. s.insert(5);
  11. s.insert(7);
  12. // cout << s.insert(3).second << '\n';
  13. // cout << s.size() << '\n';
  14. // cout << *s.lower_bound(5) << '\n';
  15. // cout << *s.upper_bound(5) << '\n';
  16. // cout << *s.lower_bound(10) << '\n';
  17. s.erase(2);
  18. cout << *s.begin() << '\n';
  19. cout << *s.end() << '\n';
  20. /*
  21. for(auto &x: s) {
  22. cout << x << '\n';
  23. }
  24. for(sit = s.begin(); sit != s.end(); sit++) {
  25. cout << *sit << '\n';
  26. }
  27. */
  28. return 0;
  29. }

multiset

多重集合,与set唯一的区别就是支持插入多个相同的数

此时使用.count(x)函数可以获取到x的出现次数

同时.size()函数也会相应改变

非常重要的一点,关于erase函数,如果直接删除某个数,会全部删除,因此我们往往是来删除一个迭代器,这样就可以每次只删除一个

  1. void Erase(int x) {
  2. auto it = s.find(x);
  3. s.erase(it);
  4. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注