簡介:vector可用於代替C中的數組,或者MFC中的CArray,從許多說明文檔或者網上評論,一般一致認為應該多用vector,因為它的效率更高,而且具備很好的異常安全性。而且vector是STL推薦使用的默認容器,除非你知道你有特殊需要,使用vector不能滿足你的需求,例如需要容器在head和tail高效的插入和刪除,或者在任何位置高效的刪除和插入操作,那么你可能使用deque或者list更加合適。
vector是連續內存容器,換句話說,標准要求所有標准庫實現的時候,vector中的元素的內存必須是連續的。所以對於插入和刪除的時間復雜度是很高的,因為刪除或者插入的時候,需要元素的移動,即元素復制拷貝。
vector的內部實現一般需要用到placement new ,所以效率很高,因為很多的時候,只要我們是使用得到,就可以省去很多的內存分配開銷。而且vector的使用,元素可以沒有默認的構造函數,但是需要拷貝構造函數的存在,這是使用CArray所無法實現的。
使用原則:
- 盡量使用vector代替C風格的數組或者CArray;
- 盡量使用算法代替手工寫的循環;
- 盡量使用vector本身的函數代替其他泛型算法;
vector的接口很容易看懂和使用,這里以一些例子來說明vector的用法。
1,填充vector
如果我們想用原始數組的內容填充vector,那么於有很多種方式。我們來一次學習vector的幾個方法。
例如我們有數組int v1[10] = {0,1,0,0,3,0,0,4,4,4};
初始化方式1:
1 |
vector< int > v2(10); //初始化size為10可以避免數組動態增長的時候不斷的分配內存 |
2 |
//v2.reserve(10);//同上,只要使用其中一個就可以了 |
3 |
for ( int i=0; i<10; i++ ) |
4 |
{ |
5 |
v2.push_back(v1[i]); //增加一個元素 |
6 |
} |
初始化方式2:
1 |
vector< int > v3(&v1[0],&v1[9]); //原始數組的元素指針可以作為迭代器來使用 |
初始化方式3:
1 |
vector< int > v4; |
2 |
v4.reserve(10); |
3 |
v4.insert(v4.begin(), &v1[0], &v[9]); |
初始化方式4:
1 |
vector< int > v5(10); |
2 |
copy(v5.begin(), &v1[0], &v1[9]); |
原始數組的元素指針可以作為迭代器來使用。
原則:盡量使用reserve來減少不必要的內存分配次數。
原則:盡量使用empty而不是size()==0 來判斷容器是否為空
有可能我們需要在vector中插入相應的元素
1 |
vector< int >::iterator i = find( v1.begin(), v1.end(), 3); |
2 |
if ( i != v1.end() ) |
3 |
{ |
4 |
v1.insert( i, 6 ); |
5 |
} |
原創文章,轉載請注明: 轉載自C/C++程序員之家
本文鏈接地址: STL之vector的使用一(初始化vector)