STL基礎--容器vector
阿新 • • 發佈:2018-11-21
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);