第一周学习总结(STL)

第一周学习总结

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课是挑战也是机遇,希望自己能不断地向更高的要求靠拢,目前还欠缺很多,也有很大的压力。但也正是压力才能让自己发现自己的潜力,借着这次宝贵机会,给自己更高的要求,全面提升自己。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值