ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

初入STL

2019-08-04 20:07:24  阅读:347  来源: 互联网

标签:std begin 删除 soldier STL 元素 初入 int


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有