萌新入门备忘录,随时更新/纠错
目录
set 自动对key排序,multiset key可重复(数据只有key)
map 自动对key排序,multimap key可重复(key-value一对一)
priority_queue 优先队列,二叉堆 赋权并按优先权出队
STL
顺序容器:vector,deque,list,forward_list,string,array
关联容器:set,map(按key储存)
之间可互相嵌套
迭代器:
声明:std::vector<int>::(const_/reverse_)iterator iter;
vector 随机访问
deque 随机访问
list 双向
set / multiset 双向
map / multimap 双向
stack 不支持
queue 不支持
priority_queue 不支持
运算符: ++ , -- , += , -= ,iter'=(iter+n) , n=iter-iter' *iter 为迭代器的值,可输入输出。
list仅有++,--操作,可以用advance(iter,n);向前移动n位
name.end()函数 返回最后一个元素后面的迭代器 [ name.begin() , name.end() )
set 自动对key排序,multiset key可重复(数据只有key)
核心:查找关键字是否存在
插入:myset.insert(n); 返回pair的second值为是否插入成功
lowe_bound()大于等于某值第一个元素,upper_bound()大于某值第一个元素(二分查找)
find类函数找不到时返回name.end();
map 自动对key排序,multimap key可重复(key-value一对一)
map<int, string> m;
m.insert(pair<int, string>(000, "aaa"));// 第一种 插入pair
m.insert(map<int, string>::value_type(001, "aaa"));// 第二种 插入value_type数据
m[002] = "aaa";// 第三种 用"array"方式插入
insert函数 (返回pair,first为map<>::iterator,second为bool) 不能覆盖旧值,数组方式可以
m[n]若不存在,直接按数组查找会生成元素,先用m.find()确定是否存在
pair(二元struct)
用first和second访问
定义时初始化:pair<string,int> p("aaa",999);
用make_pair创建新pair:p=make_pair("777",777);
用tie接收pair型返回值:int n,m; std::tie(n , m)=( pair型返回值 );
vector,list,deque
需要高效的随即存取,而不在乎插入和删除的效率,使用vector
需要大量的插入和删除,而不关心随即存取,则应使用list(没有提供[]操作符的重载)
需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
三者均有push/pop_back(),但是只有list没有front()函数
vector函数(动态数组):
下标只能用于获取已存在的元素,而不能用于插入函数
v.insert(iter,n);
sort(a.begin(),a.end());默认升序排序
list函数:
初始添加可在头尾
i.insert(i.begin(),m,n); 在i的开始位置插入m个n
i.sort(greater<int>());降序排列(注意与vector形式的不同)
priority_queue 优先队列,二叉堆 赋权并按优先权出队
priority_queue<int>a 相当于 priority_queue<int, vector<int>, less<int> > a;(默认)大顶堆
STL的函数高效,但是并不意味着耗费时间可基本忽略不计,被一个字典序的题目狠狠教育了。。
当数据量很大时就要考虑插入比较等等所花费的时间。
慎用stl,根据实际情况选择算法,不要过分依赖stl。
树,二叉树
前序:根左右
中序:左根右
后序:左右根
其中根为每个子树的根,建树等操作时,利用该序中每个子树共有的关系,通过递归划分成更小的树进行求解
只有前序和后序无法求出中序,其他可以二推一
字典树
共享字符串的公共前缀来节省空间
通过遍历字符串建树,考虑需要树中什么信息,并相应储存
最少三个要素,node[a][b]=c;
a为父节点(每个节点唯一),b为子节点(利用字符串中各字符的相对大小( 经典s[ i ] -'a' )),c为当前节点编号(保证不重复)
更多要素利用struct来实现
常用额外要素:times(当前节点重复次数),end(是否为字符串末尾)