个人ACM入门每周小总结①(STL,二叉树,字典树)

萌新入门备忘录,随时更新/纠错

目录

STL

迭代器:

set 自动对key排序,multiset key可重复(数据只有key)

map 自动对key排序,multimap key可重复(key-value一对一)

pair(二元struct)

vector,list,deque

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(是否为字符串末尾)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值