STL序列容器 vector

2021-09-26 08:47:53 字數 4081 閱讀 2653

二、vector

vector容器是包含 t 型別元素的序列容器,和 array容器相似,不同的是 vector容器的大小可以自動增長,從而可以包含任意數量的元素;因此型別引數 t 不再需要模板引數 n。只要元素個數超出 vector 當前容量,就會自動分配更多的空間。只能在容器尾部高效地刪除或新增元素。

引入標頭檔案

#include
初始化

std::vectorv; //建立乙個int型別的空陣列v

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 "

vector的主要成員函式

assign()

std::vectorv1 = ;

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

vector的訪問

at()、、front()、back()

v[idx] //返回索引idx所標示的元素,不進行範圍檢查, *(arr+idx),越界後當作指標處理(普通陣列也是一樣)。

v.at(idx) //返回索引idx所標示的元素,如果越界,丟擲range-error

v.front() //返回第乙個元素的引用,不檢查第乙個元素是否存在,可以出現在賦值運算子的左邊

v.back() //返回最後乙個元素的引用,不檢查最後乙個元素是否存在,可以出現在賦值運算子的左邊

v.data() //返回乙個指向陣列的指標,等價於v[0]( v[2] <==> *(v2.data()+2) )

vector的容量和大小

v1.size() //返回元素個數

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()直接根據引數初始化臨時物件的成員。

vector中刪除元素

v1.clear() //清除v1中的所有元素,同時將size變為0

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();

vector中插入元素

vectordata = ;  vectorv = ;

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()操作會涉及到兩次構造,首先是物件的初始化構造,接著插入時再複製一次,觸發拷貝構造。

ps:c++11 在順序容器中(vector、deque、list)引入了emplace_front()、emplace()、emplace_back(),但vector中沒有emplace_front()。理解vector的功能。

迭代器的使用

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 預...