初入STL
作者:互联网
STL基础知识
迭代器
用于提供一种方法顺序访问一个聚合对象中的各个元素
vector<T>::iterator it;
list<T>::iterator it;
deque<T>::iterator it;
for(it=v.begin();it!=v.end();it++){
}
顺序式容器
vector(向量 动态数组)
插入和删除操作少,随机访问频繁(与list相对)
功能 | 例子 | 说明 |
---|---|---|
赋值 | a.push_back(100); | 在尾部添加元素 |
元素个数 | int size = a.size(); | 元素个数 |
是否为空 | bool isEmpty = a.empty(); | 判断是否为空 |
打印 | cout<<a[0]<<endl; | 打印第一个元素 |
中间插入 | a.insert(a.begin()+i, k); | 在第i个元素前面插入k |
尾部插入 | a.push_back(8); | 尾部插入值为8的元素 |
尾部插入 | a.insert(a.end(), 10,5); | 尾部插入10个值为5的元素 |
删除尾部 | a.pop_back(); | 删除末尾元素 |
删除区间 | a.erase(a.begin()+i,a.begin()+j); | 删除区间[i, j-1]的元素 |
删除元素 | a.erase(a.begin()+2); | 删除第3个元素 |
调整大小 | a.resize(n) | 数组大小变为n |
清空 | a.clear(); | |
翻转 | reverse(a.begin(), a.end()); | 用函数reverse翻转数组 |
排序 | sort(a.begin(), a.end()); | 用函数sort排序,从小到大 |
________________vector小例题
题目描述 | 假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回"YES";否则返回"NO"。表达式长度小于255,左圆括号少于20个。 |
---|---|
思路分析 | 利用vector容器将’('读入,当读取到‘)’时,判断vector是否存在能与其相抵消的‘(’,若vector为空则为假,反之删除尾部元素。 |
#include <bits/stdc++.h>
using namespace std;
int main(){
char std;
vector<char>str;
while(scanf("%c",&std)!=EOF&&std!='@'){
if(std=='(') str.push_back(std);
else if(std==')') {
if(str.empty()) {
printf("NO\n");
return 0;
}
else str.pop_back();
}
}
if(str.empty()) printf("YES\n");
else printf("NO\n");
return 0;
}
stack(先进后出)
操作 | 说明 |
---|---|
stack<char>s; | 定义一个char数据类型的栈 |
s.push(item) | 把item放到栈顶 |
s.top(); | 返回栈顶的元素 |
s.pop(); | 删除栈顶元素;先top()获得,再pop()删除 |
s.size(); | 返回栈中元素的个数 |
s.empty(); | 检查栈是否为空,如果为空,返回true |
________________vector小例题
题目描述 | 有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合。假设从A方向驶来的火车有n节(n<=1000),分别按照顺序编号为1,2,3,…,n。假定在进入车站前,每节车厢之间都不是连着的,并且它们可以自行移动到B处的铁轨上。另外假定车站C可以停放任意多节车厢。但是一旦进入车站C,它就不能再回到A方向的铁轨上了,并且一旦当它进入B方向的铁轨,它就不能再回到车站C。负责车厢调度的工作人员需要知道能否使它以a1,a2,…,an的顺序从B方向驶出,请来判断能否得到指定的车厢顺序。 |
---|---|
思路分析 | 利用stack,依次读取车站C的顺序,获取依次已出站的车厢(既已入车站B的车厢),若读取的车厢还未入栈则先将其与其之前未入栈的车厢进站,若已入栈则将其与当前栈top的车厢比较若不同则为假。 |
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
int cx[1010];
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&cx[i]);
}
stack<int> hc;
int mcx=1;//已入站的最大车厢
for(int i=1;i<=n;i++){
while(mcx<=cx[i]){
hc.push(mcx);
mcx++;
}
if(cx[i]==hc.top()) hc.pop();
else {
cout << "NO" <<endl;
return 0;
}
}
cout << "YES" <<endl;\
return 0;
}
________________stack的应用数制转换(图例)
(1348)10 = (2504)8 ,其运算过程如下:
list
插入和删除频繁,随机访问较少(与vector相对)
- #include 创建链表 list L; listL(10);
- 方法:
- l.push_back();
- l.push_front();
- l.insert();
- reverse_iterator
题目描述 | 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 |
---|
#include<list>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
list<int>soldier;
int n,m;
cin >> n;
while(n--){
soldier.clear();
scanf("%d",&m);
list<int>::iterator it;
for(int i=1;i<=m;i++) soldier.push_back(i);
int flag=0;
while(soldier.size()>3){
int wz=1;
if(flag==0){ //报二
for(it=soldier.begin();it!=soldier.end();){
if(wz++%2==0) it=soldier.erase(it);
else it++;
}
flag=1;
}
else{
for(it=soldier.begin();it!=soldier.end();){
if(wz++%3==0) it=soldier.erase(it);
else it++;
}
flag=0;
}
}
for(it=soldier.begin();it!=soldier.end();it++){
if(it!=soldier.begin()) cout << " ";
cout << *it;
}
cout << endl;
}
return 0;
}
queue
例子 | 说明 |
---|---|
queue q; | 定义栈,Type为数据类型,如int,float,char等 |
q. push(item); | 把item放进队列 |
q.front(); | 返回队首元素,但不会删除 |
q.pop(); | 删除队首元素 |
q.back(); | 返回队尾元素 |
q.size(); | 返回元素个数 |
q.empty(); | 检查队列是否为空 |
________________queue小例题
题目描述 | 卡片游戏(Throwing cards away I, UVa 10935) 桌上有n(n≤50)张牌,从第一张牌(即位于顶面的牌)开始,从上往下依次编号为1~n。当至少还剩下两张牌时进行以下操作:把第一张牌扔掉,然后把新的第一张牌放到整叠牌的最后。输入每行包含一个n,输出每次扔掉的牌以及最后剩下的牌。 |
---|---|
思路分析 | 利用queue,按照题意给出的步骤实现代码即可 |
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
while(scanf("%d",&n)&n!=0){
queue<int>ctr;
int thr[55];
for(int i=1;i<=n;i++)
ctr.push(i); //按编号顺序排好队
for(int i=0;ctr.size()>1;i++){ //按题意要求步骤
thr[i]=ctr.front();
ctr.pop();
ctr.push(ctr.front());
ctr.pop();
}
if(n!=1) cout<<"Discarded cards: "; //特殊情况只有一张牌
else cout <<"Discarded cards:"<< endl;
for(int i=0;i<n-1;i++){ //扔掉的牌 按顺序输出
if(i!=n-2) cout << thr[i] << ", ";
else cout << thr[i] << endl;
}
cout<<"Remaining card: "<<ctr.front()<<endl;
}
return 0;
}
priority_queue
优先级高的先出列,队列与排序的结合。不仅能存储数据,还能按照设定规则进行排序。
操作 | 功能 |
---|---|
q.top(); | 返回具有最高优先级的元素值,但不删除该元素 |
q.pop(); | 删除最高优先级元素 |
q.push(item) ; | 插入新元素 |
q.empty() | 判断是否为空 |
关联式容器
map
Map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一对应关系。
- #include
- map<sring,float>m;创建
- m[“Jack”]=98.5;元素插入
- map<string,float>::iterator it;遍历访问
- for(it=m.begin();it!=m.end();it++)
- cout<<(*it).first<<“,”<<(*it).second<<endl;
- m.erase(“Bob”);删除元素
- m.find(“Bob”);元素搜索
set
集合,集合中每个元素只出现一次,并且是排好序的
例子 | 说明 |
---|---|
set A; | 定义 |
A. insert(item); | 把item放进set |
A.erase(item); | 删除元素item |
A.clear(); | 清空set |
A.empty (); | 判断是否为空 |
A.size(); | 返回元素个数 |
A.find(k); | 返回一个迭代器,指向键值k |
A.lower_bound(k); | 返回一个迭代器,指向键值不小于k的第一个元素 |
A.upper_bound(); | 返回一个迭代器,指向键值大于k的第一个元素 |
未完_
标签:std,begin,删除,soldier,STL,元素,初入,int 来源: https://blog.csdn.net/TPYEF_CHJZ/article/details/98028208