STL之向量Vector

Vector:

       本質:對數組的封裝。但功能要比數組強大,可隨時增加和刪除。

       特點:讀取能在常數時間內完成。無論向量中存100個,還是10000個,都能很快讀取。

初始化vector對象的方式:


vector聲明及初始化:

vector<int> vec;        //聲明一個int型向量
vector<int> vec(5);     //聲明一個初始大小爲5的int向量
vector<int> vec(10, 1); //聲明一個初始大小爲10且值都是1的向量
vector<int> vec(tmp);   //聲明並用tmp向量初始化vec向量
vector<int> tmp(vec.begin(), vec.begin() + 3);  //用向量vec的第0個到第2個值初始化tmp
int arr[5] = {1, 2, 3, 4, 5};   
vector<int> vec(arr, arr + 5);      //將arr數組的元素用於初始化vec向量
vector<int> vec(&arr[1], &arr[4]); //將arr[1]~arr[4]範圍內的元素作爲vec的初始值

vector常用函數:


基本操作:

(1) 容量

向量大小: vec.size();
向量最大容量: vec.max_size();
更改向量大小: vec.resize();
向量真實大小: vec.capacity();
向量判空: vec.empty();
減少向量大小到滿足元素所佔存儲空間的大小: vec.shrink_to_fit(); //shrink_to_fit

(2) 修改

多個元素賦值: vec.assign(); //類似於初始化時用數組進行賦值
末尾添加元素: vec.push_back();
末尾刪除元素: vec.pop_back();
任意位置插入元素: vec.insert();
任意位置刪除元素: vec.erase();
交換兩個向量的元素: vec.swap();
清空向量元素: vec.clear();

(3)迭代器

開始指針:vec.begin();
末尾指針:vec.end(); //指向最後一個元素的下一個位置
指向常量的開始指針: vec.cbegin(); //意思就是不能通過這個指針來修改所指的內容,但還是可以通過其他方式修改的,而且指針也是可以移動的。
指向常量的末尾指針: vec.cend();

(4)元素的訪問

下標訪問: vec[1]; //並不會檢查是否越界
at方法訪問: vec.at(1); //以上兩者的區別就是at會檢查是否越界,是則拋出out of range異常
訪問第一個元素: vec.front();
訪問最後一個元素: vec.back();
返回一個指針: int* p = vec.data(); //可行的原因在於vector在內存中就是一個連續存儲的數組,所以可以返回一個指針指向這個數組。這是是C++11的特性。

(5)算法

遍歷元素:

vector<int>::iterator it; 
for (it = vec.begin(); it != vec.end(); it++) cout<<*it<<endl;
 //或者for(i=0; i < vec.size(); i++) { cout<<vec[i]<<endl;}
元素翻轉:

#include <algorithm>
reverse(vec.begin(), vec.end());
元素排序:
#include <algorithm>
sort(vec.begin(), vec.end()); //採用的是從小到大的排序
//如果想從大到小排序,可以採用上面反轉函數,也可以採用下面方法:
bool Comp(const int& a, const int& b) {
return a > b;
}
sort(vec.begin(), vec.end(), Comp);

vector對象最重要的幾種操作:

1. v.push_back(t) 在容器的最後添加一個值爲t的數據,容器的size變大。
另外list有push_front()函數,在前端插入,後面的元素下標依次增大。
2. v.size() 返回容器中數據的個數,size返回相應vector類定義的size_type的值。v.resize(2*v.size)或v.resize(2*v.size, 99)將v的容量翻倍(並把新元素的值初始化爲99)
3. v.empty() 判斷vector是否爲空
4. v[n] 返回v中位置爲n的元素
5. v.insert(pointer,number, content) 向v中pointer指向的位置插入number個content的內容。
還有v. insert(pointer, content),v.insert(pointer,a[2],a[4])將a[2]到a[4]三個元素插入。
6. v.pop_back() 刪除容器的末元素,並不返回該元素。
7.v.erase(pointer1,pointer2)刪除pointer1到pointer2中間(包括pointer1所指)的元素。
vector中刪除一個元素後,此位置以後的元素都需要往前移動一個位置,雖然當前迭代器位置沒有自動加1,但是由於後續元素的順次前移,也就相當於迭代器的自動指向下一個位置一樣。
8. v1==v2 判斷v1與v2是否相等。
9. !=、<、<=、>、>= 保持這些操作符慣有含義。
10.vector<typeName>::iteratorp=v1.begin( ); p初始值指向v1的第一個元素。*p取所指向元素的值。 對於const vector<typeName>只能用vector<typeName>::const_iterator類型的指針訪問。
11. p=v1.end( );p指向v1的最後一個元素的下一位置。
12.v.clear() 刪除容器中的所有元素。12.v.clear() 刪除容器中的所有元素。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章