向量容器vector
(本文为笔者个人学习笔记,如有不当之处恳请各位读者指正)
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组(不需要定义数组的长度),能够增加和压缩数据。为了可以使用vector,必须在你的头文件中包含下面的代码:#include<vector>,在声明一个vector数组的同时也需要声明其保存元素的类型。如:vector<int> a;vector<char> b;
常用方法:
- size():返回vector数组的大小。
- resize():改变数组大小。
- push_back():向数组尾部添加元素。
- pop_back():删除最后一个元素(类似于队列)。
例:
简译:现有n个木块一字排开,编号从左到右为0至n-1。要求模拟一下4种操作(下面的a和b都是木块的编号)。
- move a onto b: 把a和b上方的木块全部移回原位,然后把a摞在b上面。
- move a over b: 把a上方的木块全部移回原位,然后把a放在b所在木块堆的顶部。
- pile a onto b: 把b上方的木块全部移回原位,然后把a及其上方的所有木块整体摞在b上面。
- pile a over b: 把a及上面的木块整体摞在b所在木块堆的顶部。
输入:
木块总数n
指令1
指令2
...
quit
输出:
0: 木块编号 木块编号 ...
1: 木块编号 木块编号 ...
...
n: 木块编号 木块编号 ...
#include<iostream>
#include<string.h>
#include<vector>
#include<string>
using namespace std;
const int maxn=30;
int n;
vector<int> pile[maxn];
// 找木块a所在的堆和其所处高度,以引用的形式返回给调用者
void find_block(int a, int& p, int& h){
for(p=0;p<n;p++){
for(h=0;h<pile[p].size();h++){
if(pile[p][h] == a)
return;
}
}
}
// 把p堆高度为h的木块上方的所有木块移回原位
void clear_above(int p, int h){
for(int i=h+1;i<pile[p].size();i++){
int b=pile[p][i];
pile[b].push_back(b); // 把木块b放回原位
}
pile[p].resize(h+1); // p堆中只保留下标0~h的木块
}
// 把第p堆高度为h及其上方的木块整体移动到p2堆的顶部
void pile_onto(int p, int h, int p2){
for(int i=h;i<pile[p].size();i++){
pile[p2].push_back(pile[p][i]);
}
pile[p].resize(h); // p堆中只保留0~h-1的木块
}
// 输出
void print(){
for(int i=0;i<n;i++){
printf("%d:",i);
for(int j=0;j<pile[i].size();j++)
printf(" %d",pile[i][j]); // 注意输出的每个数字前有一个空格
printf("\n");
}
}
int main(){
int a,b;
cin>>n; // 木块个数
string s1,s2;
for(int i=0;i<n;i++)
pile[i].push_back(i); // 初始化木块堆
while(cin>>s1>>a>>s2>>b){ // 按空格读入操作
int pa,pb,ha,hb; // pa:木块a所在的堆,ha:木块a在该堆中所处的位置
find_block(a,pa,ha); // 查找木块a所在的堆,及在该堆中的位置
find_block(b,pb,hb);
if(pa==pb) // a、b在同一堆中非法指令
continue;
if(s2=="onto")
clear_above(pb,hb); // 把第pb堆中高度为ph的木块上方的所有木块移回原位
if(s1=="move")
clear_above(pa,ha);
pile_onto(pa,ha,pb); // 把第pa堆高度为ha及其上方的木块整体移动到pb堆的顶部
}
print(); // 输出每堆的信息
return 0;
}
题目链接: The Blocks Problem - UVa 101