simple C++ vector

轉載: 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

  1.基本操作
  vector是向量類型,她是一種對象實體,具有值,所以可以看作是變量。她可以容納許多其他類型的相同實體,
如若干個整數,所以稱其爲容器。Vector是C++STL(標準模板類庫)的重要一員,使用她時,只要包括頭文件#include<vector>即可。
  vector可以有四種定義方式:
複製代碼
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);
上面第(4)種形式的b.begin() 、b.end()是表示向量的起始元素位置和最後一個元素之外的元素位置。
向量元素位置也屬於一種類型,稱爲遍歷器。遍歷器不單表示元素位置,還可以在容器中前後挪動。
每種容器都有對應的遍歷器。向量中的遍歷器類型爲:
vector<int>::iterator
因此要輸入向量中所有元素,可以有兩種循環控制方式:
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[i]是向量元素操作,這種形式和數組一樣;
第二種方法是遍歷器方式,*it是指針間訪形式,它的意義是it所指向的元素值。
   a.size()是向量中元素的個數a.begin()表示向量的第一個元素,這種操作方式是一個對象捆綁一個函數調用,
表示對該對象進行某個操作。
   類似這樣的使用方式稱爲調用對象a的成員函數,這在對象化程序設計中很普遍。
向量中的操作都是通過使用成員函數來完成的。它的常用操作有:

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

用 STL vector 來創建二維數組
通常情況下,採用向量創建二維數組的方法有兩種:
方法一:

複製代碼
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));
但是由一個問題是怎樣將二維數組中的元素一次性全部賦值給二維向量呢?
使用向量還是有很多好處的。例如:
(1)數組無法整體複製
int a[10] = {0};
int b[10] = a; //

vector<int> c(10);
vector<int> d = c; //正確
(2)向量有很多種的定義方式,還可以從數組中獲得初值;
int a[3] = {1, 2, 3};
vector<int> va(a, a+3);
(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()); //從小到大排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章