1. 程式人生 > >STL基礎--容器vector

STL基礎--容器vector

    vector的記憶體:佔用一段連續的記憶體,所以vector擁有array的特性:支援隨機查詢即能夠用下標快速訪問指定的元素。

    vector能夠實時的增加或減少元素,如果在首部或者中間插入、刪除元素時,後面的所有元素都要移動,效率很差。

    vector增加元素時,如果當前記憶體塊記憶體不夠用時會發生記憶體塊更換,從而引發iterator失效

    適用範圍:隨機查詢、後入後出

  • 構造方法
vector<T> c default建構函式,產生一個空的vector,沒有任何元素
vector<T> c(c1) copy建構函式
vector<T> c = c1 copy建構函式
vector<T> c(move(c1)) move建構函式
vector<T> c = move(c1) move建構函式
vector<T> c(n) 利用元素的default建構函式生成一個大小為n的vector
vector<T> c(n, val) 建立一個大小為n的vector,每個元素都是val
vector<T> c(beg, end) 建立一個vector,以區間[beg, end)為元素初值
vector<T> c(initlist) 建立一個vector,以初值列initlist為元素初值
vector<T> c = initlist 建立一個vector,以初值列initlist為元素初值
  • 增加元素
push_back(val) 附加一個val的拷貝於末尾
insert(pos, val) pos之前插入一個val的拷貝,並返回新元素的位置
insert(pos, n, val) pos之前插入n個val的拷貝,並返回第一個新元素的位置
insert(pos, beg, end) pos之前插入區間[beg, end)內所有元素的拷貝,並返回第一個新元素的位置
insert(pos, initlist) pos之前插入區間initlist內所有元素的拷貝,並返回第一個新元素的位置
emplace(pos, args...) pos前插入一個以args為初值的元素,並返回新元素的位置
emplace_back(args) 末尾附加一個以args為初值的元素,不返回任何內容
resize(n) 將元素數量改為n,如果size()變大,多出來的元素以default建構函式初始化
resize(n, val) 將元素數量改為n,如果size()變大,多出來的元素初始化為val
  • 刪除元素
pop_back() 移除最後一個元素
erase(pos) 移除pos上的元素,並返回下一個位置
erase(beg, end) 移除區間[beg, end)內的所有元素,並返回下一位置
resize(n) 將元素數量改為n,如果size()變大,多出來的元素以default建構函式初始化
resize(n, val) 將元素數量改為n,如果size()變大,多出來的元素初始化為val
clear() 移除所有元素,將容器清空
  • 修改操作
c = c1 將c1全部元素賦值給c
c = move(c1) 將c1的所有元素以move assign方式給予c
c = initlist 將初值列initlist的所有元素賦值給c
assign(n, val) 複製n個val, 賦值給c
assign(beg, end) 將區間[beg, end)內的元素賦值給c
assign(initlist) 將初值列initlist的所有元素賦值給c
c1.swap(c2) 置換c1和c2的資料
swap(c1, c2) 置換c1和c2的資料
  • 其他查詢類操作
empty() 返回容器是否為空(相當於size() == 0)
size() 返回目前元素個數
max_size() 返回元素個數的最大可能量
capacity() 返回“不進行空間重新分配”條件下的元素最大容納量
reserve() 如果容量不足,擴大之
shrink_to_fit() 要求降低容量,以符合元素個數
c[idx] 返回索引idx所指的元素
at(idx) 返回索引idx所指的元素
front() 返回第一個元素
back() 返回末尾元素
  • 迭代器相關
begin() 返回一個random-access iterator指向第一元素
end() 返回一個random-access iterator指向最末元素的下一位置
cbegin() 返回一個const random-access iterator指向第一元素
cend() 返回一個const random-access iterator指向最末元素的下一位置
rbegin() 返回一個反向(reverse) iterator指向反向迭代的第一個元素
rend() 返回一個反向(reverse) iterator指向反向迭代的最末元素的下一位置
crbegin() 返回一個反向const reverse iterator指向反向迭代的第一個元素
crend() 返回一個反向const reverse iterator指向反向迭代的最末元素的下一位置

 

下面是一個關於vector記憶體分佈的大致猜測:

vector能夠使用下標進行隨機查詢,所以我們能夠確定vector儲存元素的主體部分是類似array的記憶體分佈,那麼我們再來看一下在vector<int> vcInt中,&vcInt與&vcInt[0]是否相等或是在記憶體地址上有什麼聯絡:

int main()
{
	vector<int> vcInt({ 1,2,3,4 });
	cout << "&vcInt   : " << &vcInt << endl;
	cout << "&vcInt[0]: " << &vcInt[0] << endl;
	cout << "&vcInt[1]: " << &vcInt[1] << endl;
	system("pause");
	return 0;
}

輸出結果為

顯然vector存放元素的部分是單獨分配的一段記憶體,且結構與陣列一樣(是不是很有趣,是不是很好奇&vcInt這塊記憶體中存放的是什麼結構/壞笑)

那麼我們在將vector拷貝到陣列array[]時是不是也可以這麼使用:

memcpy(array, &vcInt[0], size_t);