vector容器(一)


一、 Vector簡要描述

 

vector是C++標准模版庫STL提出的一種順序存儲結構,之所以稱之為“容器”,是因為vector是一個模板類,它允許我們重復利用已有的實現構造自己的特定類型下的數據結構。通過設置vector的參數允許我們制定容器匯總的元素的數據類型,可以將許多重復而乏味的工作簡化。

 

眾所周知,常用的數據結構有array(數組)、list(鏈表)、tree(樹)、stack(棧)、heap(堆)、queue(隊列)、hash table(散列表)、set(集合)、map(映射表)等。 --摘自《STL源碼剖析》by 侯捷

根據在容器中的排列特性,這些數據結構分為序列式容器(sequence container)和關聯式容器(associative container)。   

序列式容器: 關聯式容器:
Array: C++的內建數據結構   RB-tree(Red-Black Tree,紅黑樹)
heap: 通過算法的方式實現(大頂堆/小頂堆) map/mulitmap: 內部實現方式,RB-Tree
priority-queue: 本質還是heap,通過算法的方式實現 set/multiset: 內部實現方式,RB-Tree
list/slist:鏈表  [hash table]: 非標准
deque: 雙向鏈表

 [hash_multiset]: 非標准

 [hash_mutimap]:非標准

stack/queue: 適配器,底層由deque實現

 [hash_set]:  非標准

 [hash_map]: 非標准

 

需要指出的是:

1. vector在內存中是順序存儲的,其滿足順序數據結構的特征:支持順序訪問和隨機訪問。

2. 在C++程序中,如果沒有特殊說明或者特殊要求的話,當需要使用動態數組時,請盡量使用vector,避免用戶自己定義動態數組。理由如下:

   (1) vector雖然本質上的實現方式還是動態數組,但是作為STL一員,vector提供了許多封裝好的函數,並且其內部實現經過了大量的測試與優化,使得用戶使用更為方便。

   (2) vector就C++用戶自定義的動態數組在元素的動態插入和刪除方面,提供了較為方便的庫函數,避免用戶在指針使用上出現不必要的錯誤。

3. 雖然vector提供了元素的動態插入和刪除操作,但是當程需要頻繁的插入和刪除操作的時候,vector就不適用了,而應該使用deque或者list。

 

二、Vector用法 

 

1. vector容器的定義:(參考自:http://www.cplusplus.com/reference/vector/vector/

在C++98標准中,vector的聲明如下:

1 template < class T, class Alloc = allocator<T> > class vector; // generic template

 

由於vector是STL的一員,所以在程序中需要定義vector時,需要引用命名空間std:

using namespace std; 

在程序中定義一個某一特定類型的vector的方式如下:

vector<Data_Type> vi; // vi為vector的變量名, Data_Type為vi中元素的類型

 

2. vector類中成員變量

   具體的成員變量如下:

member type

definition

notes

value_type

The first template parameter (T)

 

allocator_type

The second template parameter (Alloc)

defaults to:allocator<value_type>

reference

allocator_type::reference

for the default allocator:value_type&

const_reference

allocator_type::const_reference

for the default allocator: const value_type&

pointer

allocator_type::pointer

for the default allocator:value_type*

const_pointer

allocator_type::const_pointer

for the default allocator: const value_type*

iterator

a random access iterator to value_type

convertible to const_iterator

const_iterator

a random access iterator to const value_type

 

reverse_iterator

reverse_iterator<iterator>

 

const_reverse_iterator

reverse_iterator<const_iterator>

 

difference_type

a signed integral type, identical to:iterator_traits<iterator>::difference_type

usually the same as ptrdiff_t

size_type

an unsigned integral type that can represent any non-negative value of difference_type

usually the same as size_t


 在眾多成員變量中,我們經常會用到iterator,這個有很多中叫法:游標,迭代器。
 
該變量用於對vector中某個位置進行操作。一般用法:
vector<Data_Type>::iterator iter; // iter為迭代器名,Data_Type為vector中元素的類型

 會破壞迭代器的函數操作,任何插入和刪除操作:

insert , push_back, pop, remove, erase,  assign

 

3. vector中常用函數的用法:

(1)賦值函數 assign

1 template <class InputIterator>
2     void assign (InputIterator first, InputIterator last);  //1. 復制    
3     void assign (size_type n, const value_type& val);    // 2. 填充

若定義某vector<value_tpye> 對象 vi, 那么vi的成員函數assign,有兩種實現方法:

填充,自vi的頭部開始連續的n個元素都填入元素值val。

復制,將另一個vector或者某種連續存儲的區間的某一個區間復制到新的vector vi之中。

調用實例:

 1 #include<iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     vector<int> v1;
 8     vector<int> v2;
 9     vector<int> v3;
10     int from[3] = {1,2,3};
11     
12     v1.assign(10,7);  // 填充
13     cout<<v1.size()<<endl;
14 
15     v2.assign(v1.begin().v1.end()); //vector同類型復制     
16     cout<<v2.size()<<endl;
17 
18     v3.assign(from, from+2); //連續內存復制 
19     cout<<v3.size()<<endl;
20 
21     return 0;
22 } 
assign使用方法

 

(2)訪問函數at 

    參考:http://www.cplusplus.com/reference/vector/vector/at/

    對於at的使用,需要注意其返回值為reference,v.at(pos)表示的是在vector中pos所在的位置上的元素。

    ps: at函數是Exception safety的,也就是說當at訪問的是一個非法地址的時候,at會throw一個out of range的異常,不會有內存溢出。

   

    與at類似的函數還有:     

begin: 返回vector首元素的地址

front: 返回vector第一個元素值

end: 返回vector尾元素的地址

back :   返回vector最后一個元素的值


(3) 插入函數 insert
 

iterator insert (iterator position, const value_type& val); //單元素定點插入    

void insert (iterator position, size_type n, const value_type& val);    //定點多元素填充插入

template <class InputIterator> 
void insert (iterator position, InputIterator first, InputIterator last); //定點連續內存覆蓋插入

與assign函數類似,對vector進行插入操作insert的實現也是分為填充和復制,不過多了一個單元素插入的操作,此外就是insert函數規定了插入的位置。

實現實例:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 vector<int> vi;
 6 
 7 void print(vector<int> v)
 8 {
 9      vector<int>::iterator iter;
10      for(iter = v.begin(); iter!= v.end();iter++)
11      {
12          cout<<*iter<<" ";
13      }
14      cout<<endl;
15 }
16 
17 int main()
18 {   
19     vi.clear();    
20     vector<int>::iterator iter;
21     iter = vi.begin();
22     /******************************************************
23      *  insert(iterator pos,int n,elem_type elem);
24      *  在pos位置及之后的n-1個位置上插入元素elem 
25      ******************************************************/
26     vi.insert(iter,10,20);
27     print(vi);
28 
29     vi.clear();  //清空vector   
30     for(int i=0;i<10;i++)
31       vi.push_back(i);
32     print(vi);
33     
34     vi.clear();
35     iter = vi.begin();
36     /******************************************************
37      *  insert(iterator pos,elem_type elem);
38      *  在pos位置上插入元素elem 
39      ******************************************************/
40     for(int j=0;j<10;j++)
41         vi.insert(iter+j,j);
42         
43     /******************************************************
44      *  insert(iterator pos, iterator begin, iterator end);
45      *  將vi中的[begin,end]之間的數據在pos位置上插入 
46      ******************************************************/
47     vi.insert(iter, vi.begin(), vi.end());
48     print(vi);
49     return 0;
50 }
insert實現

與insert類似的函數還有:

         push_back(value_type & value); 只能在vector的末尾加入value.

 

(4)刪除函數erase

iterator erase (iterator position); //刪除單個元素
iterator erase (iterator first, iterator last); //刪除連續區間內的元素

由於刪除某一個元素之后迭代器會失效,所以需要特別注意連續刪除的時候迭代器計數問題。

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 int main ()
 6 {
 7   vector<int> myvector;
 8 
 9   // 賦值操作
10   for (int i=1; i<=10; i++) myvector.push_back(i);
11 
12   // 刪除第6個元素
13   myvector.erase (myvector.begin()+5);
14 
15   // 刪除連續的3個元素
16   myvector.erase (myvector.begin(),myvector.begin()+3);
17 
18   cout << "myvector contains:";
19   for (unsigned i=0; i<myvector.size(); ++i)
20        cout << ' ' << myvector[i];
21   cout << '\n';
22 
23   return 0;
24 }
erase使用

類似函數: clear:清空vector中的元素

 

(5) 容量函數 size

在vector中與容量有關的函數有:

capacity

返回系統當前為vector分配的內存大小

size

返回當前vector中元素的個數

max_size

返回系統能夠為vector分配的最大內存的大小

resize(int rsize,value_type elem)

改變當前vector的大小成rsize:

1)如果rsize大於當前vector的大小n,則將[n,rsize-1]區間內填充elem

    elem 默認值為0

2)如果resize小於當前vector大小n,則將當前的vector截取rsize大小


resize使用方法resize實現:

 

參考:http://www.cplusplus.com/reference/vector/

轉載請指明出處http://www.cnblogs.com/double-win/,謝謝~

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM