1.温故了原码,反码,补码的概念
2.lowbit 函数,用来返回二进制数最低位的1:
int lowbit(int x) {
return x & ( -x);
}
3.返回二进制数含有多少1的函数:
int cnt(int x) {
res = 0;
while (x > 0) {
res++;
x -= lowbit(x);
}
return res;
}
4.算法学习——状态压缩dp,进阶搜索,双向广度搜索
5.stl map
map
与普通的数组赋值有几个区别:
-
键值对的存储方式不同:
map
以键值对的形式存储数据,每个元素都有一个唯一的键与之对应。而普通数组只能使用整数索引来访问元素,没有键值对的概念。 -
动态大小:
map
的大小是动态调整的,可以根据需要插入或删除键值对。而普通数组的大小是静态的,在创建时需要指定固定的长度。 -
自动排序:
map
中的元素是按照键的大小进行自动排序的。这使得在使用map
时可以方便地根据键的顺序进行遍历和查找。而普通数组的元素按照索引的顺序排列,没有自动排序的特性。 -
键的唯一性:
map
中的键必须是唯一的,如果插入相同的键,则后面的值会覆盖前面的值。这使得map
适用于存储具有唯一标识符的数据。而普通数组允许重复的元素。 -
高效的查找和插入操作:
map
内部使用红黑树等数据结构实现,使得查找和插入操作具有较高的效率。而普通数组的查找操作通常需要遍历整个数组。
map中元素的插入
在map中元素有两种插入方法:
使用下标
使用insert函数
在map中使用下标访问不存在的元素将导致在map容器中添加一个新的元素。
insert函数的插入方法主要有如下:
m.insert(e)
m.insert(beg, end)
m.insert(iter, e)
上述的e一个value_type类型的值。beg和end标记的是迭代器的开始和结束。
map<int, int> mp;
mp.insert(pair<int,int>(1, 2));
map<int, int> mp;
mp.insert(make_pair<int,int>(2,3));
map<int, int> mp;
mp[4] = 5;
前三种方法当出现重复键时,编译器会报错,有的可能不会报错但是会忽视重复键插入,而第四种方法,当键重复时,会覆盖掉之前的键值对。
map中元素的查找和读取
注意:上述采用下标的方法读取map中元素时,若map中不存在该元素,则会在map中插入。
因此,若只是查找该元素是否存在,可以使用函数count(k),该函数返回的是k出现的次数;若是想取得key对应的值,可以使用函数find(k),该函数返回的是指向该元素的迭代器。
#include <stdio.h>
#include <map>
using namespace std;
int main(){
map<int, int> mp;
for (int i = 0; i < 20; i++){
mp.insert(make_pair(i, i));
}
if (mp.count(0)){
printf("yes!\n");
}else{
printf("no!\n");
}
map<int, int>::iterator it_find;
it_find = mp.find(0);
if (it_find != mp.end()){
it_find->second = 20;
}else{
printf("no!\n");
}
map<int, int>::iterator it;
for (it = mp.begin(); it != mp.end(); it++){
printf("%d->%d\n", it->first, it->second);
}
return 0;
}
从map中删除元素
从map中删除元素的函数是erase()
,该函数有如下的三种形式:
m.erase(k)
m.erase(p)
m.erase(b, e)