天天看點

vector

//    vector<int> vec;

//    for(int i = 0; i < 10; i++)

//    {

//        vec.push_back(5);

//    }

//    

//    vector<int>::iterator itr;

//    for(itr = vec.begin(); itr != vec.end();)

//        if(*itr == 5)

//        {

//            vec.erase(itr);

//        }

//        else

//            itr++;

//

//    for(int i = 0; i < vec.size(); i++)

//        cout << vec.at(i) << endl;

C++ Vector(向量容器)

是一個線性順序結構。相當于數組,但其大小可以不預先指定,并且自動擴 展。它可以像數組一樣被操作,由于它的特性我們完全可以将vector 看作動态數 組。

在建立一個vector 後,它會自動在記憶體中配置設定一塊連續的記憶體空間進行資料 2

存儲,初始的空間大小可以預先指定也可以由vector 預設指定,這個大小即 capacity ()函數的傳回值。當存儲的資料超過配置設定的空間時vector 會重新配置設定 一塊記憶體塊,但這樣的配置設定是很耗時的,在重新配置設定空間時它會做這樣的動作:

首先,vector 會申請一塊更大的記憶體塊; 然後,将原來的資料拷貝到新的記憶體塊中; 其次,銷毀掉原記憶體塊中的對象(調用對象的析構函數); 最後,将原來的記憶體空間釋放掉。

如果vector 儲存的資料量很大時,這樣的操作一定會導緻糟糕的性能(這也 是vector 被設計成比較容易拷貝的值類型的原因)。是以說vector 不是在什麼情 況下性能都好,隻有在預先知道它大小的情況下vector的性能才是最優的。

vector 的特點:

(1) 指定一塊如同數組一樣的連續存儲,但空間可以動态擴充。即它可以像數組 一樣操作,并且可以進行動态操作。通常展現在push_back() pop_back() 。

(2) 随機通路友善,它像數組一樣被通路,即支援[ ] 操作符和vector.at()

(3) 節省空間,因為它是連續存儲,在存儲資料的區域都是沒有被浪費的,但是 要明确一點vector 大多情況下并不是滿存的,在未存儲的區域實際是浪費的。 (4) 在内部進行插入、删除操作效率非常低,這樣的操作基本上是被禁止的。 Vector 被設計成隻能在後端進行追加和删除操作,其原因是vector 内部的實作 是按照順序表的原理。

(5) 隻能在vector 的最後進行push 和pop ,不能在vector 的頭進行push 和pop 。 (6) 當動态添加的資料超過vector 預設配置設定的大小時要進行記憶體的重新配置設定、拷 貝與釋放,這個操作非常消耗性能。 是以要vector 達到最優的性能,最好在創 建vector 時就指定其空間大小。

Vectors 包含着一系列連續存儲的元素,其行為和數組類似。通路Vector中的 任意元素或從末尾添加元素都可以在常量級時間複雜度内完成,而查找特定值的 元素所處的位置或是在Vector中插入元素則是線性時間複雜度。

1.Constructors 構造函數

vector<int> v1; //構造一個空的vector

vector<int> v1( 5, 42 ); //構造了一個包含5個值為42的元素的Vector

2.Operators 對vector進行指派或比較

C++ Vectors能夠使用标準運算符: ==, !=, <=, >=, <, 和 >. 要通路vector中的某特定位置的元素可以使用 [] 操作符. 兩個vectors被認為是相等的,如果:

1.它們具有相同的容量

2.所有相同位置的元素相等. vectors之間大小的比較是按照詞典規則.

3.assign() 對Vector中的元素指派 文法:

void assign( input_iterator start, input_iterator end );

// 将區間[start, end)的元素賦到目前vector

void assign( size_type num, const TYPE &val );

// 賦num個值為val的元素到vector中,這個函數将會清除掉為vector指派以前的内容.

3

4.at() 傳回指定位置的元素 文法:

TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;

5.back() 傳回最末一個元素

6.begin() 傳回第一個元素的疊代器

7.capacity() 傳回vector所能容納的元素數量(在不重新配置設定記憶體的情況下) 8.clear() 清空所有元素

9.empty() 判斷Vector是否為空(傳回true時為空)

10.end() 傳回最末元素的疊代器(譯注:實指向最末元素的下一個位置) 11.erase() 删除指定元素

文法:

iterator erase( iterator loc );//删除loc處的元素

iterator erase( iterator start, iterator end );//删除start和end之間的元素

12.front() 傳回第一個元素的引用 13.get_allocator() 傳回vector的記憶體配置設定器 14.insert() 插入元素到Vector中

iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入值為val的元素,傳回指向這個元素的疊代器, void insert( iterator loc, size_type num, const TYPE &val ); //在指定位置loc前插入num個值為val的元素

void insert( iterator loc, input_iterator start, input_iterator end ); //在指定位置loc前插入區間[start, end)的所有元素

15.max_size() 傳回Vector所能容納元素的最大數量(上限) 16.pop_back() 移除最後一個元素

17.push_back() 在Vector最後添加一個元素

18.rbegin() 傳回Vector尾部的逆疊代器

19.rend() 傳回Vector起始的逆疊代器 20.reserve() 設定Vector最小的元素容納數量

//為目前vector預留至少共容納size個元素的空間 21.resize() 改變Vector元素數量的大小

void resize( size_type size, TYPE val ); //改變目前vector的大小為size,且對新建立的元素指派val

22.size() 傳回Vector元素數量的大小 23.swap() 交換兩個Vector

void swap( vector &from ); 

本文轉自蓬萊仙羽51CTO部落格,原文連結:http://blog.51cto.com/dingxiaowei/1366454,如需轉載請自行聯系原作者

繼續閱讀