學過C++的人肯定會很熟悉STL標準模板庫,STL其實就是封裝了一系列的介面,供我們呼叫。很多函式或者演算法的實現不需要我們從頭開始寫,大大提高我們的程式設計效率。這篇部落格在簡單介紹STL的情況下,會詳細的來介紹vector的使用。
STL共有六大元件:
一。容器(Container):是一種資料結構,如list,vector,deque,queue等,以模板類的方法提供,為了訪問容器中的資料,可以使用由容器類提供的迭代器。
二。迭代器(Iterator):提供了訪問容器中物件的方法。
三。演算法(Algorithm):用來操作容器中的資料的模板函式。
四。仿函式(Function object)。
五。迭代介面卡(Adapter)。
六。控制元件介面卡(allocator)。
我們這裡主要會討論的是容器、迭代器和演算法。這篇部落格我們先來談談vector。相關的示例程式碼上傳至https://github.com/chenyufeng1991/STL_vector 。vector對應的資料結構為陣列,而且是動態陣列,也就是說我們不必關心該陣列事先定義的容量是多少,它的大小會動態增長。與陣列類似的是,我們可以在末尾進行元素的新增和刪除,也可以進行元素值的隨機訪問和修改。首先要引入標頭檔案 #include <vector>。具體使用如下:
(1)vector的建立
1 2 3 4 5 6 7 |
vector<int> vec1; // 建立一個空的vector vector<int> vec2(vec1); // 建立一個vector vec2,並用vec1去初始化vec2 vector<int> vec3(10); // 建立一個含有n個資料的vector vector<int> vec4(10,0); // 建立含有10個資料的vector,並全部初始化為0 |
建構函式進行了過載,可以用多種方式建立vector。
(2)push_back(),pop_back()新增刪除元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 在vector尾部新增元素 vec1.push_back(4); vec1.push_back(6); vec1.push_back(8); vec1.push_back(1); vec1.push_back(2); PrintVector(vec1); // 在vector尾部刪除元素 vec1.pop_back(); PrintVector(vec1); // 在vector頭部新增元素,無法完成,因為vector的資料結構為陣列,無法在頭部插入元素,否則需要整個陣列前移; // 在vector頭部刪除元素,無法完成,理由同上。 |
可以使用push_back()不斷的在vector尾部新增元素,使用pop_back刪除尾部元素。操作非常的方便,比我們直接用陣列結構方便多了。
(3)[],at(),取某位置的元素值
1 2 3 |
// 取vector中某位置的元素值 cout << "在1位置的元素值為:" << vec1.at(1) << endl; cout << "在1位置的元素值為:" << vec1[1] << endl; |
因為vector的資料結構就是一個陣列,所以可以進行隨機訪問。
(4)begin(),end(),指向頭元素、尾元素的指標
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void PrintVector(vector<int> ve) { cout << "Vector中的資料為:"; vector<int>::iterator veIterator; for (veIterator = ve.begin(); veIterator < ve.end(); veIterator++) { cout << *veIterator << " "; } cout << endl; } |
這裡以列印vector中的所有元素來理解begin().end()。這裡需要使用迭代器來進行遍歷,也可以把迭代器理解為指標,把begin(),end()分別理解為頭指標和尾指標。這樣就能訪問到vector中的每一個元素了。
(5)back(),front(),訪問頭部元素和尾部元素
1 2 3 4 5 6 7 |
// 返回尾部資料的引用 cout << "尾部資料的值為:" << vec1.back() << endl; // 返回頭部資料的引用 cout << "頭部資料的值為:" << vec1.front() << endl; |
(6)max_size(),vector的最大容納量;size():vector當前的元素個數。
1 2 3 |
cout << "vector中的最大容量為:" << vec1.max_size() << endl; cout << "vector中的元素個數為:" << vec1.size() << endl; |
(7)empty(),判斷vector是否為空
1 |
cout << "vector是否為空:" << vec1.empty() << endl; |
如果為空,返回1.否則返回0。
(8)swap():交換兩個vector中的值。
(9)sort():對vector升序排序;reverse():對vector降序排序。
1 2 3 4 5 6 7 8 9 |
// 對vector進行升序排序 sort(vec1.begin(), vec1.end()); PrintVector(vec1); // 對vector進行降序排序 reverse(vec1.begin(), vec1.end()); PrintVector(vec1); |
傳遞的引數是需要排序的範圍,因為這裡要對整個vector排序,所以引數分別指向頭部和尾部。
(10)[],at():修改元素
1 2 3 4 5 6 7 8 |
// 修改vector中的某個值 vec1[2] = 99; PrintVector(vec1); vec1.at(3) = 88; PrintVector(vec1); |
(11)erase():刪除某個元素
在刪除元素時,要借用迭代器。
(12)insert(): 插入元素
同樣要藉助迭代器。
(13)clear():清除所有元素
執行以後就是一個空的vector,不包含任何元素。
關於vector的更詳細介紹可以參考文件:http://en.cppreference.com/w/cpp/container/vector