不定长数组:vectorios
vector就是一个不定长数组。不只如此,它把一些经常使用操做“封装”在了vector类型内部。 例如,若a是一个vector,能够用a.size( )读取它的大小,a.resize( )改变大小,a.push_back( )向 尾部添加元素,a.pop_back( )删除最后一个元素。数组
vector是一个模板类,因此须要用vectora或者vectorb这样的方式来声明一 个vector。Vector是一个相似于inta[]的整数数组,而vector就是一个相似于 stringa[ ]的字符串数组。vector看上去像是“一等公民”,由于它们能够直接赋值,还能够做为 函数的参数或者返回值,而无须像传递数组那样另外用一个变量指定元素个数。(n=strlen(a);)数据结构
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~函数
木块问题(The Blocks Problem,Uva 101)学习
从左到右有n个木块,编号为0~n-1,要求模拟如下4种操做(下面的a和b都是木块编 号)。 测试
一组数据的结束标志为"quit",若是有非法指令(a和b在同一堆),应当忽略。ui
输出:全部操做输入完毕后,从左到右,从下到上输出每一个位置的木块编号。spa
#include<iostream> #include<cstdio> #include<string> #include<vector> using namespace std; int n; vector<int> pile[30]; void find_block(int x,int &xp,int &j){ for(int i=0;i<n;i++){ for(j=0;j<pile[i].size();j++){ if(pile[i][j]==x) { xp=i; return; } } } } //把第p堆高度为h的木块上方的全部木块移回原位 void clear_above(int p,int h){ for(int i=h+1;i<pile[p].size();i++){ int x=pile[p][i]; pile[x].push_back(x); } pile[p].resize(h+1); } //把第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); } //print 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; string s1,s2; cin>>n; for(int i=0;i<n;i++) pile[i].push_back(i); while(1){ cin>>s1; if(!s1.compare("quit")) break; cin>>a>>s2>>b; int pa,pb,ha,hb; find_block(a,pa,ha); find_block(b,pb,hb); if(pa==pb) continue;//在同一堆,忽略 if(!s2.compare("onto")) clear_above(pb,hb); if(!s1.compare("move")) clear_above(pa,ha); pile_onto(pa,ha,pb); } print(); return 0; }
数据结构的核心是vectorpile[maxn],全部操做都是围绕它进行的。vector就像一个 二维数组,只是第一维的大小是固定的(不超过maxn),但第二维的大小不固定。上述代码 还有一个值得学习的技巧:输入一共有4种指令,但若是彻底独立地处理各指令,代码就会 变得冗长并且易错。更好的方法是提取出指令之间的共同点,编写函数以减小重复代码。code
vector头文件中的vector是一个不定长数组,能够用clear( )清空,resize( ) 改变大小,用push_back( )和pop_back( )在尾部添加和删除元素,用empty( )测试是否为 空。vector之间能够直接赋值或者做为函数的返回值,像是“一等公民”同样。blog