其他分享
首页 > 其他分享> > 初入STL

初入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>           
#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映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一对应关系。


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