不定長數組: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