轉載: http://www.cnblogs.com/CBDoctor/archive/2011/12/24/2300363.html
C++向量
向量(Vectors)
轉自:http://blog.chinaunix.net/space.php?uid=14534760&do=blog&id=2800619
vector<int>是模板形式,尖括號中爲元素類型名,她可以是任何合法的數據類型。
(1)vector<int> a(10);
//定義了10個整數元素的向量,但並沒有給出初值,因此其值是不確定的。
(2)vector<int> b(10,1);
//定義了10個整數元素的向量,且給出每個元素的初值爲1。這種形式是數組望塵莫及的,
//數組只能通過循環來成批的賦給相同初值。
(3)vector<int> c(b);
//用另一個現成的向量來創建一個向量。
(4)vector<int> d(b.begin(),b.begin()+3);
//定義了其值依次爲b向量中第0到第2個(共3個)元素的向量。
int a[8]={2007,9,24,2008,10,14,10,5};
vector<int> va(a,a+8);
for(int i=0; i<a.size(); ++i) //第一種方法
cout<<a[i]<<" ";
for(vector<int>::iterator it=a.begin(); it!=a.end(); ++it) //第二種方法
cout<<*it<<" ";
a.assign(b.begin(), b.begin()+3); //b向量的0~2元素構成向量賦給a
a.assign(4,2); //使a向量只含0~3元素,且賦值爲2
int x=a.back(); //將a的最後一個向量元素值賦給整數型變量x
a.clear(); //a向量中元素清空(不再有元素)
if(a.empty()) cout<<"empty"; //a.empty()經常作爲條件,判斷向量是否爲空
int y=a.front(); //將a的第一個向量元素值賦給整型變量y
a.pop_back(); //刪除a向量的最後一個元素
a.push_back(5); //在a向量最後插入一個元素,其值爲5
a.resize(10);
//將向量元素個數調至10個。多則刪,少則補,其值隨機
a.resize(10,2); //將向量元素個數調至10個。多則刪,少則補,其值爲2
if(a=b) cout<<"epual"; //向量的比較操作還有 !=, <, <=, >, >=
除此之外,還有元素的插入與刪除、保留元素個數、容量觀察等操作。
|
下面我們做一道習題,在一個名爲data.txt的文檔中,保存着如下數據
1 2 3 4 5 6 7 8
6 7 8 6 7 6 7 8
我們讓其顯示在dos界面上,代碼如下:
1 #include<iostream>
2 #include<fstream>
3 #include<vector>
4 using namespace std;
5 //-------------------------------
6 int main()
7 {
8 ifstream in("D:\\data.txt");//yuexingtian.txt文件必須要和此程序放在同一個文件夾下
9 vector<int> s;
10 int a;
11 //char b;//如果data.txt中有逗號存在,則該行不註釋
12 int m=0;
13 while(in>>a)//將yuexingtian.txt的數據全都讀入a中
//while(in>>a>>b)
14 {
15 s.push_back(a);//在s向量最後插入元素a的
16 }
17 int h=s.size();
18 for(int k=0;k<h;k++)
19 {
20 cout<<s[k]<<' ';
21 }
22 int pair=0;
23 for(int i=0;i<s.size()-1;++i)//比較是否有相等的數的for循環
24 for(int j=i+1;j<s.size();++j)
25 if(s[i]==s[j])
26 {
27 pair++;
28 }
29 cout<<pair<<endl;
30
31 }
二維向量的操作:
參見博客:http://blog.chinaunix.net/space.php?uid=14534760&do=blog&id=2800624
1 int row=3;//行數
2 int column=4;//列數
3 vector<vector<int> >arry2(row);//定義一個三行四列的數組
4 for (int i=0;i< arry2.size( );i++)
5 {
6 arry2[i].resize(column);
7 }
vector<vector<int> >arry2(row,vector<int>(column));
int a[10] = {0};
int b[10] = a; //錯
vector<int> c(10);
vector<int> d = c; //正確
int a[3] = {1, 2, 3};
vector<int> va(a, a+3);
int n;
cin>>n;
int a[n]; //不正確,數組大小不確定
若採用動態定做,從而需要釋放空間
int n;
cin>>n;
int* ap = new int[n];
// 一系列數據處理
delete[] ap;
如果換成向量,則一目瞭然
int n;
cin>>n;
vector<int> va(n);
數組無法擴容
vectot<int> va;
//無法想象對應的數組操作
for (int a; cin>>a; va.push_bach(a));
向量還有好多常用的操作,這些操作是數組所不具備,但同時向量又可以像數組一樣被使用,例如
vector<int> a;
a.push_bach(5); //在a向量最後位置插入一個元素
a.pop_back(); //刪除a向量的最後一個元素
a.clear(); //清空a向量中的元素
int x = a.front(); //將a向量的第一個元素賦給x
int y = a.back(); //將a向量的最後一個元素賦給y
bool b = a.empty(); //判斷是否爲空
a.resize(10); //將元素個數調至10個,多則刪,少則補
//等等
其中a.begin(),b.end()分別表示向量a的起始元素位置和最後一個元素之外的元素位置.
輸出向量中的元素可以如下:
for (int i = 0; i < a.size(); ++i)
cout<<a[]<<" ";
此外,向量還可以排序:
sort(a.begin(), a.end()); //從小到大排序