白书上的例题,关于vector的使用。不定长数组vector,类型内部封装了一些常用操作。vector就像一个二维数组,只有第一维的大小是固定的,可以像数组一样访问到其中的每一个元素。
vector<int> v; 常用操作 v.size(); v.clear();清空 v.resize();改变大小 v.push_back();在尾部添加元素 v.pop_back();在尾部删除元素 v.empty();检测是否为空
vector之间可直接赋值或作为函数的返回值,像是“一等公民”一样。
注意事项:1.读题时提取指令间的共同点,减少重复代码。 2.代码中用到引用
find_block(a,pa,ha); void find_block(int a ,int& p ,int& h ) { for(int p = 0; p < n; p++) { for(int h = 0; h < pile[p].size() ; h++) { if(pile[p][h]==a) return; } } }
#include<iostream> #include<cstdio> #include<vector> #include<string> using namespace std; #define MAXN 30 int n; string s1,s2; vector<int> pile[MAXN]; //以引用的形式返回调用者 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; } } } void clear_above(int p,int h) { for(int i = h+1;i < pile[p].size();i++) { int k = pile[p][i]; pile[k].push_back(k); } 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); } int main() { int a,b; while(cin>>n) { for(int i=0;i<n;i++) { pile[i].push_back(i); } int pa,ha,pb,hb; while(cin>>s1) { if(s1=="quit") break; cin>>a>>s2>>b; find_block(a,pa,ha); find_block(b,pb,hb); if(pa==pb) continue; if(s2=="onto") { clear_above(pb,hb); } if(s1=="move") { clear_above(pa,ha); } pile_onto(pa,ha,pb); } 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"); } } return 0; }