这是书上的一个例题,具体代码分析就不多说了,在这里主要是想总结一下书中提到的vector的用法。
vector是包含在#include<vector>的头文件中。下面,我们定义vector<int> a , 以此讨论它的用法。
首先要说明一点,这里的a相当于一个一维数组(数组a中的默认元素为0),以此类推如果我们定义vector<int> a[10],那么a就相当于一个二维数组。
一、读取它的 大小
这点需运用 “a.size()”,其中括号里什么都没有,引号里的内容可以与c语言中字符串函数的“strlen(a)”,他们都是返回一个具体数值,这个数值就是长度。
二、改变它的大小
这点需运用“a.resize()” , 如果我们使用"a.resize(3)" ,那么此时数组a的长度就为3,其包含元素a[0], a[1], a[2], 若原来的长度大于3,比如是5,那么改变后a[3],a[4]都将被删掉。
三、向尾部添加元素
这点需运用“a.push_back()”, 这里的括号只能放一个元素,如“a.push_back(5)”,相当于在a的尾部添加一个5,同时数组长度也就是“a.size()”也相应加一。
四、删除最后一个元素
这点需运用“a.pop_back()” ,其中括号里什么都没有,如果原来a.size() = 3 并且 a[2] = 2, 那么使用a.pop_back后a[2]就被删除,同时数组长度也就是a.size()也相应减一。
<div style="text-align: left;"><pre name="code" class="cpp">#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
const int maxn = 30;
vector<int> pile[maxn];
int n;
//返回木块m所在的位置和高度
void finding(int m, int &hm, int &pm)
{
for(pm = 0; pm < n; pm++)
for(hm = 0; hm < pile[pm].size(); hm++)
if(pile[pm][hm] == m) return ;
}
//将第p堆高度为h的木块上方所有的木块移回原位
void return_(int h, int p)
{
for(int i = h+1; i < pile[p].size(); i++)
pile[pile[p][i]].push_back(pile[p][i]); //将木块pile[p][i]移回原位
pile[p].resize(h+1); //p应只保留下标为0-h的元素
//将第pm堆高度为h及其上方所有的木块移到pn的顶部
void pile_(int hm, int pm, int pn)
{
for(int i = hm; i < pile[pm].size(); i++)
pile[pn].push_back(pile[pm][i]);
pile[pm].resize(hm); //pm应只保留下标为0-(hm-1)的元素
}
void print()
{
for(int i = 0; i < n; i++){
cout << i << ':';
for(int j = 0; j < pile[i].size(); j++)
printf(" %d",pile[i][j]);
printf("\n");
}
}
int main()
{
string s1, s2;
int a, b;
cin >> n;
for(int i = 0; i < n; i++)
pile[i].push_back(i);
while(cin >> s1 && s1 != "quit" && cin >> a >> s2 >> b){
int pa, ha, pb, hb;
finding(a, ha, pa);
finding(b, hb, pb);
if(pa == pb) continue;
if(s1 == "move") return_(ha, pa);
if(s2 == "onto") return_(hb, pb);
pile_(ha, pa, pb);
}
print();
return 0;
}