二、vector
vector容器是包含 t 型別元素的序列容器,和 array容器相似,不同的是 vector容器的大小可以自動增長,從而可以包含任意數量的元素;因此型別引數 t 不再需要模板引數 n。只要元素個數超出 vector 當前容量,就會自動分配更多的空間。只能在容器尾部高效地刪除或新增元素。
引入標頭檔案
#include
初始化
std::vectorv; //建立乙個int型別的空陣列vvector的主要成員函式std::vectorv1(13); //建立乙個int型別的陣列,初始元素個數為13,初始值都為預設值0
std::vectorv1(13,int_max); //建立乙個int型別的陣列,初始元素個數為13,初始值都為2147483647
std::vectorv3 = ; //c++11中才能這樣初始化
std::vectorv3 ; //c++11中才能這樣初始化
std::vectorv2(v1); //等價於std::vectorv2 = v1;
std::vectorv2(v1.begin()+6,v1.end()); //使用迭代器初始化v2
std::vectorv2(begin(v1),end(v1)); //使用迭代器初始化v2
ps:mac中使用 "g++ -std=c++11 "
assign()
std::vectorv1 = ;vector的訪問std::vectorv2 = ;
v2.assign(v1.begin(),v1.end()-1); //
v2.assign(5,2); //
v2 = v1; //
ps:vector中的assign函式原型
void assign(const_iterator first,const_iterator last);
void assign(size_type n,const t& x = t());
assign在string中還有更多函式原型 c++ stl—string
at()、、front()、back()
v[idx] //返回索引idx所標示的元素,不進行範圍檢查, *(arr+idx),越界後當作指標處理(普通陣列也是一樣)。vector的容量和大小v.at(idx) //返回索引idx所標示的元素,如果越界,丟擲range-error
v.front() //返回第乙個元素的引用,不檢查第乙個元素是否存在,可以出現在賦值運算子的左邊
v.back() //返回最後乙個元素的引用,不檢查最後乙個元素是否存在,可以出現在賦值運算子的左邊
v.data() //返回乙個指向陣列的指標,等價於v[0]( v[2] <==> *(v2.data()+2) )
v1.size() //返回元素個數vector中新增元素v1.capacity() //返回當前容器的容量
v1.reserve(n); //改變當前容器的容量為n(n大於當前容量才起作用)
v1.resize(n); //改變當前容器的大小為n(n小於原來的大小就擷取前面n個單位的部分,n大於原來的大小就填充預設值)
v1.resize(n,val); //改變當前容器的大小為n(n小於原來的大小就擷取前面n個單位的部分,n大於原來的大小就填充val的值)
向容器中新增元素的唯一方式是使用它的成員函式。vector中刪除元素v1.push_back(val) //在v1的末尾新增乙個元素,值為val
v1.emplace_back(val); //在v1的末尾新增乙個元素,值為val,c++11推薦使用
ps: emplace_back() 比 push_back() 更有效率,push_back()右值時就會呼叫建構函式和轉移建構函式,emplace_back()直接根據引數初始化臨時物件的成員。
v1.clear() //清除v1中的所有元素,同時將size變為0vector中插入元素v1.pop_back(); // 移除v1中的最後乙個元素
在不用考慮陣列順序的時候,想刪除指定下標的元素。(可將最後乙個元素的值賦給要刪除的元素位置,然後使用pop_back()高效刪除)
if (idx < list.size())
list[idx] = list.back();
list.pop_back();
erase通過傳入迭代器進行刪除,既可以刪除單個元素,也可以刪除某一範圍的元素,刪除之後它將返回下乙個位置的迭代器,如果移除了最後乙個元素,會返回 std::end(data)。
vectordata = ;
auto it1 = data.erase(data.begin()+3); // *it1 = 5
auto it2 = data.erase(data.begin()+1,data.end()-1); // *it2 = 6
ps:clear()、pop_back()、erase()刪除元素後都不會改變vector容量大小,如需去掉多餘的容量,當不再需要對容器進行增加刪除操作後可以使用shrink_to_fit()去除多餘的容量。 data.shrink_to_fit();
vectordata = ; vectorv = ;ps:c++11 在順序容器中(vector、deque、list)引入了emplace_front()、emplace()、emplace_back(),但vector中沒有emplace_front()。理解vector的功能。insert(idx,val) 在迭代器idx後面插入乙個元素val data=
insert(idx,n,val) 在迭代器idx後面插入n個val元素 data=
data.insert(idx,first,last) 在迭代器idx後面插入迭代器first到last間的元素 data=
emplace(idx,val) 在迭代器idx後面插入乙個元素val data=
emplace()直接在容器管理的記憶體空間中構造元素;insert()操作會涉及到兩次構造,首先是物件的初始化構造,接著插入時再複製一次,觸發拷貝構造。
迭代器的使用
c.begin() //返回乙個隨機訪問迭代器,指向第乙個元素其他成員函式或演算法c.end() //返回乙個隨機訪問迭代器,指向最後乙個元素
c.cbegin() //返回乙個隨機訪問常迭代器,指向第乙個元素
c.cend() //返回乙個隨機訪問常迭代器,指向最後乙個元素
c.rbegin() //返回乙個逆向迭代器,指向逆向迭代的第乙個元素
c.rend() //返回乙個逆向迭代器,指向逆向迭代的最後乙個元素
c.crbegin() //返回乙個逆向常迭代器,指向逆向迭代的第乙個元素
c.crend() //返回乙個逆向常迭代器,指向逆向迭代的最後乙個元素
ps:常迭代器(指向常量的迭代器),不能修改其指向的內容。
reverse(first,last) //顛倒迭代器[first,last)間的元素順序swap(v1,v2) 或 v1.swap(v2) //交換v1與v2的內容,size、capacity也一起交換
v.empty() //v為空,返回true
STL 序列式容器 vector詳解
vector 的資料安排以及操作方式,與 array 非常相似。兩者唯一的差別在於對空間運用的靈活性。array 是靜態空間,一旦配置了就不能改變。vector 是動態空間,隨著元素的加入,它的內部機制會自行擴充空間以容納新元素。一下內容主要針對 vector 基本的資料結構以及常用的方法進行介紹。...
STL序列式容器之vector
序列式容器 序列式容器 可序列集群,其中的元素都可序,但未必有序。vector概述 vector的資料安排以及操作方式,與array非常相似。兩者的唯一差別在於空間的運用的靈話性,array 是靜態空間,一旦配置了就不能改變 要換個大 或小 一點的房子,可以,一切瑣細得由客戶端自己來 首先配置一塊新...
STL順序容器 vector
vector是乙個線性順序結構。相當於陣列,但其大小可以不預先指定,並且自動擴 展。它可以像陣列一樣被操作,由於它的特性我們完全可以將vector 看作動態數 組。在建立乙個vector 後,它會自動在記憶體中分配一塊連續的記憶體空間進行資料 儲存,初始的空間大小可以預先指定也可以由vector 預...