3月13日一周学习总结
STL简单应用
(以下顺序以个人理解应用程度由高到低排序)
sort
格式 sort(首地址,尾地址,排序方式)
排序方式默认为升序排序,可自己定义(若排序对象为string类型,则以字典序进行默认排序
如降序排序方式:
bool cmp(int a,int b)
return a>b;
同时也可以对结构体进行排序
如先以x升序排序,若x相同后按y降序排列
struct str{int x,int y;};
bool cmp(str a,str b)
{if(a.x<a.x)
return true;
else
if(a.x=b.x)
if(a.y<b.y)
return true;
return false;
(做题常见的数组处理方法,绝大多数优化处理都要进行排序处理)
string类
string支持输入可变长度的字符串并可以对其进行操作,如:
访问单个字符,初始化,字符串之间的复制,连接,比较等,还可以判断是否为空。
string s;
s = "one"//赋值
string s1 = "two"//初始化
cout<<s.size<<endl;//输出长度
s.empty()//判断字符串s是否为空
s1+=s;//把s追加到s1后面
string类型的比较为字典序比较
(做题时使用次数较多,代码中多包含循环结构,如:
for(int i=0;i<s.size;i++)
可以对字符串中的元素进一步进行判断与处理)
unique
去重处理(并非删除重复元素,而是进行排序,将重复的放入数组末端,后返回重复数前一个元素的地址)
使用unique之前需要先进行排序,因为unique针对相邻元素
upper_bound和 lower_bound
格式:upper_bound(首地址,尾地址,目标元素)
返回大于目标元素的第一个位置
格式:lower_bound(首地址,尾地址,目标元素)
返回大于等于目标元素的第一个位置
(即lower_bound返回符合目标元素的第一个位置upper_bound返回最后一个符合目标元素的位置)
栈,队列以及优先队列
栈 Stack
格式:stack<类型> 栈名;
如stack <int>s;
原则:先进后出,只有一个出口,只能对栈顶元素进行操作
操作:s.empty()–返回bool类型,判断栈是否为空
s.size()–返回栈的个数
s.top()–返回栈顶元素
s.pop()–移除栈顶元素
s.push(a)–向栈中压入一个元素a
队列 queue
格式:queue<类型>队列名;
如queue<int>q;
原则:先进先出,尾进头出,地段加入元素,顶端取出元素
操作:q.empty()–返回bool类型,判断队列是否为空
q.size()–返回队列的个数
q.pop()–移除队列中的下一个元素
q.push(a)–向队列中压入一个元素a
q.front()–返回队列的下一个元素
q.back()–返回队列内的最后一个元素
优先队列 priority_queue
格式:priority_queue<类型>优先队列名;
如priority_queue<int>p;
原则:权值最高的元素排在前面
操作:p.empty()–返回bool类型,判断队列是否为空
p.size()–返回队列的个数
p.pop()–移除队列中的下一个元素
p.push(a)–向队列中压入一个元素a
p.top()–返回队列的下一个元素
动态数组vector
个人对vector的理解是它可以开辟一个大小变化的数组,并能够对其内部元素进行操作
格式:vector <类型> 动态数组名称;
如:vector v;
操作:v.empty() – 返回bool型,表示vector是否为空
v.size() – 返回vector内元素个数
v.push_back(a) 将元素a插入最尾端
v,pop_back() 将最尾端元素删除
v[i] 类似数组取第i个位置的元素(v[0] )
set和multiset
个人对set的理解是set为一个集合,其中包含了不重复的元素,而multiset则可以包含相同元素,与其他容器相比拥有更快地查找速度
set中常用的方法
insert() 向set里面插入一个元素
begin() 返回set容器的第一个元素
end() 返回最后一个元素的下一个元素的索引,最后一个值为*(–s.end());
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素最大个数
size() 返回当前set容器中的元素个数
rbegin 返回的值和end()相同
rend() 返回的值和rbegin()相同
map和multimap
个人对于map的理解是一种可以标记元素的容器,其内部元素为pair,每个pair包含一个键值和实值,键值不允许重复,但在multimap中可以
map常用的方法
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
(迭代器类似指针)
本周学习感悟与收获
这周主要介绍的STL函数,其中sort和string在以往做题中使用较多,较为熟悉,而栈,队列,动态数组只是在参考代码中见到过,进行过了解但并未使用过,对其使用情况还是缺少认识,至于优先队列和set组合以及map则是从未见过使用的代码,对其了解程度更是浅薄,根据网上查找的文章进行了解后发现set和multiset使用的为平衡检索二叉树:红黑树,在其运算查找时会以二分的形式进行查找,因此其运算速度为log2级别的,将会缩短代码运行时间,而map关联容器,内部自建红黑树,但是目前对于数据结构方面的问题认识几乎为零,对于这两者的使用仍需继续研究。
这周除了对STL函数有了一个初步的认识之外,还在codeforces过了一道与括号法则有关的题目(这次没hacked)让我对于括号法则相关的题目有了大致的解题方向,设置一个计数器,每次出现左括号便加1,出现右括号则减1,最后判断完毕若计数器不等于0则说明不满足括号法则,反之满足。