第一周学习总结
STL
一、字符串(string)
- 头文件:
<string>
- 定义:
string
- 访问:
下标访问:范围从0到s.size()-1
迭代器访问 - 常用操作:

二、栈(stack)
- 头文件
stack
- 定义:
stack<data_type> stack_name;
- 操作:
s.empty();//返回bool类型表示栈内是否为空
s.size();//返回栈元素个数
s.top();//返回栈顶元素
s.pop();//移除栈顶元素
s.push(a);//向栈内压入一个元素a - 先进后出
三、队列(queue)
- 头文件:
<queue>
- 定义:
queue <data_type> queue_name;
- 操作:
q.empty();//返回bool型,表示queue是否为空
q.size(); // 返回queue内元素个数
q.front();//返回queue内的下一个元素 (返回第一个元素,队头)
q.back();//返回queue内的最后一个元素
q.pop();//移除queue中的一个元素(只能在队首移除)
q.push(a);//将一个元素a置入queue中(只能在队尾加入)
四、向量(vector)
- 头文件:
<vector>
- 定义:
queue<date_type>queue_name;
- 操作:
v.empty();//判断是否为空
v.size();//返回元素个数
v.push_back(a);//尾部插入
v.pop_back();//尾部删除
v.front();//返回第一个位置
v.back();//返回最后一个位置
v.clear();//清空
v.erase(pos);//删除一个元素
v.erase(a.begin()+i,a.begin()+j);//删除一个区间[i,j-1]
v.insert(v.begin(),10); //在起始位置插入10
v.insert(v.begin(), 2, 10); //在起始位置插2个10
v.insert(v.begin(), v2.begin(), v2.end());//在起始位置插入某个区间(地址)
v[i]类似数组取第i个位置的元素。
补充:
vector是由指针管理的动态数组 ,而之前大多使用的都是静态数组(很低级),vector能够节省空间,因为它可以根据需要改变数组大小,但是在重新申请一块足够大的内存时也会影响vector的效率,它可以存放任意类型的对象(整型字符串型,结构体,类类型 )。在定义时也可以进行对数组的初始化。
vector a(10,“hello”);//10个值为hello的元素
vector b(a.begin(),a.end());//b是a的复制
调整大小:a.resize(n);
翻转:reverse(a.begin(),a.end());
排序:sort(a.begin(),a.end());
五、优先队列(priority_queue)
- 一个拥有权值观念的queue,自动依照元素的权值排列,权值最高排在前面。
- 头文件:
<queue>
- 定义:
priority_queue <data_type> priority_queue_name;
- 操作:
q.push(elem)// 将元素elem置入优先队列
q.top();//返回优先队列的下一个元素
q.pop(); //移除一个元素
q.size();//返回队列中元素的个数
q.empty();//返回优先队列是否为空
q.back();//返回q的末尾元素
less和greater优先队列(less是从大到小,greater是从小到大)
声明格式:
priority_queue <int,vector<int>,less<int> > p;priority_queue <int,vector<int>,greater<int> > q;
六、集合(set)
- set 和 multiset会根据特定的排序准则,自动将元素排序,两者的不同之处在于multiset可以允许元素重复而set不允许元素重复。
- 头文件:
<set>
- 定义:
set <data_type> set_name;
- 操作:
s.insert(elem) // 安插一个elem副本,返回新元素位置。
s.erase(elem) // 移除与elem元素相等的所有元素,返回被移除的元素个数。
s.erase(pos) // 移除迭代器pos所指位置上的元素,无返回值。
s.clear() // 移除全部元素,将整个容器清空。
s.size() //返回容器大小。
s.empty() //返回容器是否为空。
s.count(elem) // 返回元素值为elem的元素的个数。
s.lower_bound(elem) //返回元素值>= elem的第一个元素位置。
s.upper_bound(elem) // 返回元素值 > elem的第一个元素的位置。以上位置均为一个迭代器。
s.begin() //返回一个双向迭代器,指向第一个元素。
s.end() // 返回一个双向迭代器,指向最后一个元素的下一个位置。
七、映射(map)
- 所有元素都会根据元素的键值自动排序,map的所有元素都是pair,pair的第一个元素被视为键值,第二个元素为实值。map不允许两个元素有相同的键值,但multimap可以。
- 头文件:
<map>
- 定义:
map<date_type1,date_type2>map_name;
- 操作:
m.size();//返回容器大小
m.empty();//返回容器是否为空
m.count(value);//返回实值等于value的元素的个数
m.find(value);//返回迭代器位置
m.lower_bound(key);//返回键值等于key的元素的第一个可安插的位置(第一个满足条件的元素的地址)
m.upper_bound(key);//返回键值等于key的元素的最后一个可安插的位置(最后一个满足条件的元素的地址)
m.begin();//返回一个双向迭代器,指向第一个元素
m.end();//返回一个双向迭代器,指向最后一个元素的下一个 位置。
m.clear();//将整个容器清空
m.erase(elem);//移除键值为elem的所有元素
m.erase(pos);//移除迭代器pos所指位置上的元素直接元素存取
m[key] = value;//查找的时候如果没有键值为key的元素,则安插一个键值为key的新元素,实值为默认(一般0)
m.insert(e);//插入一个元素e
swap(map1,map2);//交换两个map
补充:
访问 访问值it->first:访问键it->second
(这两种访问都是在迭代器的情况下)
m.insert(elem) 插入一个元素elem
a)运用value_type插入
map<string, float> m;
m.insert(map<string, float>:: value_type (“Robin”, 22.3));
b) 运用pair<>
m.insert(pair<string, float>(“Robin”, 22.3));
c) 运用make_pair()
m.insert(make_pair(“Robin”, 22.3));
八、pair
- 头文件:
<utility>
- 定义:
pair<data_type1,data_type2> pair_name;
- 操作:
pair<data_type1,data_type2> p(elem1,elem2) //构造一个元素值分别为 elem1、elem2 的 pair。
pair<data_type1,data_type2> p1(p2) //产生另一个同型 pair 的副本,所有元素都被复制。
pair 的一对值可以具有不同的数据类型(T1 和 T2),两个值可以分别通过其公有函数 first、second 来进行访问与赋值。
//赋值:
//利用 make_pair() 函数来赋值
pair<int, double> p1;p1 = make_pair(1, 1.2);12122)
//变量间赋值
pair<int, double> p1(1, 1.2);
pair<int, double> p2 = p1;
九、运算符重载
- 格式:
返回值类型& operator 运算符(形参表)
{}
或者
返回值类型 operator 运算符(形参表)
{} - 重载>
class Student {
bool operator>(const Student& p)
{
if(score>p.score)
return true;
else if(score==p.score&&name<p.name)
return true;
else return false;
}
};
- 重载<
//如果想按照自己的方式排序,可以重载小于号。
struct new_type{
int x, y;
bool operator < (const new_type &a)const{
if(x != a.x) return x < a.x;
return y < a.y;
}
}
本周学习了STL,以上是知识回顾(只是一些目前理解的常用操作,不够全面)之后还会继续补充
sicky notes:
- 缩短cin,cout时长
#include<bits/stdc++.h>
using namespace std;int main(){
sync_with_stdio(false);
、、、
return 0;
}
- 技巧:
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(i,a,n) for(int i=a;i<=n;i++) //相当于for循环
frecpen("in.txt","r",stdin);//输入方式转换为文件格式,当测试数据非常繁琐的时候,改变输入方式
const int inf=0x3f3f3f3f;//无穷大
typedef long long ll;//定义一种类型(此为长整型)
开学以来做的题很少,参加了一场cf第一题简单题做了很长时间wrong test,比赛结束看了别人题解但自己没有进一步分析,今晚再回头整理一下。贪心算法的题目做了两题,A题一开始是内存问题改了数组,后来又for循环的嵌套导致超时,最后知道了是思路问题,规律找得不彻底,怎么才能更优化要多积累要向优化解思考怎样减少时间。B题读题时间长,一开始题目不理解没有思路,后来重读找到关键,发现很熟悉,一开始想到了是需要标记来实现,但又是一个贪心题目,现在还是不理解贪心是怎样的思想,只是简单的找最优解吗?在接下来的学习和做题中要有意识地分析理解贪心思想。后来提交是wrong,但是样例和其他数据都能通过,解题思路也是一般的思路不应该是思路的问题,重读题目,找数据和格式的细节,后来发现样例是多组输入!多组输入!改了以后就立刻AC了。
学习acm课是挑战也是机遇,希望自己能不断地向更高的要求靠拢,目前还欠缺很多,也有很大的压力。但也正是压力才能让自己发现自己的潜力,借着这次宝贵机会,给自己更高的要求,全面提升自己。