C++ vector,STL vector
vector 是順序容器的一種。vector 是可變長的動態數組,支持隨機訪問迭代器,所有 STL 算法都能對 vector 進行操作。要使用 vector,需要包含頭文件 vector。
在 vector 容器中,根據下標隨機訪問某個元素的時間是常數,在尾部添加一個元素的時間大多數情況下也是常數,總體來說速度很快。
在中間插入或刪除元素時,因為要移動多個元素,因此速度較慢,平均花費的時間和容器中的元素個數成正比。
在 vector 容器中,用一個動態分配的數組來存放元素,因此根據下標訪問某個元素的時間是固定的,與元素個數無關。
vector 容器在實現時,動態分配的存儲空間一般都大于存放元素所需的空間。例如,哪怕容器中只有一個元素,也會分配 32 個元素的存儲空間。這樣做的好處是,在尾部添加一個新元素時不必重新分配空間,直接將新元素寫入適當位置即可。在這種情況下,添加新元素的時間也是常數。
但是,如果不斷添加新元素,多出來的空間就會用完,此時再添加新元素,就不得不重新分配內存空間,把原有內容復制過去后再添加新的元素。碰到這種情況,添加新元素所花的時間就不是常數,而是和數組中的元素個數成正比。
至于在中間插入或刪除元素,必然涉及元素的移動,因此時間不是固定的,而是和元素個數有關。
vector中常用的成員函數
| vector() | 無參構造函數,將容器初始化為空 |
| vector(int n) | 將容器初始化為有 n 個元素 |
| vector(int n, const T & val) | 假定元素的類型是 T,此構造函數將容器初始化為有 n 個元素,每 個元素的值都是 val |
| vector(iterator first, iterator last) | first 和 last 可以是其他容器的迭代器。一般來說,本構造函數初始化的結果就是將 vector 容器的內容變成與其他容器上的區間 [first, last) —致 |
| void clear() | 刪除所有元素 |
| bool empty() | 判斷容器是否為空 |
| void pop_back() | 刪除容器末尾的元素 |
| void push_back( const T & val) | 將 val 添加到容器末尾 |
| int size() | 返回容器中元素的個數 |
| T & front() | 返回容器中第一個元素的引用 |
| T & back() | 返回容器中最后一個元素的引用 |
| iterator insert(iterator i, const T & val) | 將 val 插入迭代器 i 指向的位置,返回 i |
| iterator insert( iterator i, iterator first, iterator last) | 將其他容器上的區間 [first, last) 中的元素插入迭代器 i 指向的位置 |
| iterator erase(iterator i) | 刪除迭代器 i 指向的元素,返回值是被刪元素后面的元素的迭代器 |
| iterator erase(iterator first, iterator last) | 刪除容器中的區間 [first, last) |
| void swap( vector & v) | 將容器自身的內容和另一個同類型的容器 v 互換 |
示例 vector 的基本用法。
#include <iostream> #include <vector> //使用vector需要包含此頭文件 using namespace std; template <class T> void PrintVector(const vector <T> & v) { //用于輸出vector容器的全部元素的函數模板typename vector <T>::const_iterator i;//typename 用來說明 vector <T>::const_iterator 是一個類型,在 Visual Studio 中不寫也可以for (i = v.begin(); i != v.end(); ++i)cout << *i << " ";cout << endl; } int main() {int a[5] = { 1, 2, 3, 4, 5 };vector <int> v(a, a + 5); //將數組a的內容放入vcout << "1) " << v.end() - v.begin() << endl; //兩個隨機迭代器可以相減,輸出:1)5cout << "2)"; PrintVector(v); //輸出:2)1 2 3 4 5v.insert(v.begin() + 2, 13); //在 begin()+2 位置插人 13cout << "3)"; PrintVector(v); //輸出:3)1 2 13 3 4 5v.erase(v.begin() + 2); //刪除位于 begin()+2 位置的元素cout << "4)"; PrintVector(v); //輸出:4)1 2 3 4 5vector<int> v2(4, 100); //v2 有 4 個元素,都是 100v2.insert(v2.begin(), v.begin() + 1, v.begin() + 3); //將v的一段插入v2開頭cout << "5)v2:"; PrintVector(v2); //輸出:5)v2:2 3 100 100 100 100v.erase(v.begin() + 1, v.begin() + 3); //刪除 v 上的一個區間,即 [2,3)cout << "6)"; PrintVector(v); //輸出:6)1 4 5return 0; }PrintVector 模板演示了將容器的引用作為函數參數的用法。就完成輸出整個容器內容這個功能來說,寫成 PrintVector 模板這樣是比較笨拙的,該模板的適用范圍太窄。有沒有更好的寫法?
vector 還可以嵌套以形成可變長的二維數組。例如:
#include <iostream> #include <vector> using namespace std; int main() { vector<vector<int> > v(3); //v有3個元素,每個元素都是vector<int> 容器for(int i = 0;i < v.size(); ++i)for(int j = 0; j < 4; ++j)v[i].push_back(j);for(int i = 0;i < v.size(); ++i) {for(int j = 0; j < v[i].size(); ++j)cout << v[i][j] << " ";cout << endl;}return 0; }程序的輸出結果是:
0 1 2 3 0 1 2 3 0 1 2 3vector< vector > v(3);定義了一個 vector 容器,該容器中的每個元素都是一個 vector 容器。即可以認為,v 是一個二維數組,一共 3 行,每行都是一個可變長的一維數組。
總結
以上是生活随笔為你收集整理的C++ vector,STL vector的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 字符串拼接的各种玩法
- 下一篇: C语言const的用法详解