小知识

one

a&b + a|b = a + b;
(a&b) << 1 + (a^b) = a + b;

two

set的插入以及删除

set<int> s; 
s.insert(x); // 插入x
s.erase(s.find(x));//假设我们要删除s中的x ,这里是删除迭代器
s.erase(x); // 也可以直接删除
for(int x: s) cout << x << endl; // 遍历 set

set遍历删除的时候会出问题,最好避免这种写法
这里推荐一种写法 CF1753-C

// 这里 u = 0 要换成最小值
for(int u = 0; s.upper_bound(u) != s.end(); ) {
    u = *s.upper_bound(u);
    s.erase(u); 
}

three

multiset 包含重复元素的set

multiset<int> s;
s.insert(5);
cout << s.count(x); // 返回 s 中 x 的个数
s.erase(s.find(x)); //删除 s 中的一个 x
s.erase(x); //删除 s 中的全部 x, 有返回值 x 的个数
s.erase(posa, posb); //删除迭代器posa - posb 之间的数字
s.clear(); // 清空 s

一道STL题目
LC2034
map+堆 以及 multiset + map 第二种写法LC双百

posted @ 2021-08-30 14:02  ccz9729  阅读(42)  评论(0编辑  收藏  举报