日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C vector详解

發布時間:2023/12/2 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C vector详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【導讀】:vector是一個封裝了動態大小數組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象。可以簡單的認為,vector是一個能夠存放任意類型的動態數組。接下來,請跟隨小編一起來復習一下吧。

以下是正文


前言

本文mark了vector的一些接口,介紹了vector中的對內存和對象的管理詳解請見cppreference-vector。


1. vector內部管理著一塊內存,壓入對象的時候,會使用這塊內部的內存使用placement new去進行對象的生成,而釋放對象的時候,顯式的去調用析構函數去釋放對象。


2. size代表vector中的實際含有元素數量,而capacity表示容量。


3. resize()調整size的時候會生成或釋放元素,釋放的本質只是調用了析構,但是那塊內存塊還在vector中。


4. reserve()調整capacity的時候只會增大但是不會減小。


5. push_back()同時支持copy構造&和移動語義構造&&,配合std::move或者std::forward效果更佳。


6. earse()用來刪除元素,參數是迭代器, 范圍刪除的時候是前閉后開【 )。


7. emplace()相當于insert(),但是其通過參數包和模板偏特化減少了一次拷貝構造的過程。

正文

?

2.1 vector基本布局

一個簡單的vector,我們可以理解成如下形式,主要是舉了reserve()和resize()這兩個例子,來舉例vector是如何分配內存,創建初始化對象的,以及析構對象的;


vector內部管理著一塊內存,當需要push_back對象的時候,會使用這塊內部的內存使用placement new去進行對象的生成,而釋放對象的時候,顯示的去調用析構函數去釋放對象(這只是一種理解,實際實現不一定如此,但是原理上大同小異)

template<class T>class vector{ ? ?public: ? ? ? ?unsigned char *buffer; ? ? ? ?int size_; ? ? ? ?int capacity_; ? ? ? ?T value_type; ? ? ? ?//分配內存 ? ? ? ?void reserve(int capacity){ ? ? ? ? ? if(capacity > capacity_){//創建一塊新內存放過去 ? ? ? ? ? ? ? ?unsigned char * temp = malloc(sizeof(value_type) * capacity); ? ? ? ? ? ? ? ?memcpy(temp, buffer, capacity_); ? ? ? ? ? ? ? ?capacity_ = capacity; ? ? ? ? ? ? ? ?free(buffer); ? ? ? ? ? ? ? ?buffer = temp; ? ? ? ? ? } ? ? ? ?} ? ? ? ? //調整元素 ? ? ? ?void resize(int size){ ? ? ? ? ? ?int duration = sizeof(value_type); ? ? ? ? ? ?if(size > size_){ ? ? ? ? ? ? ? ?for(int i = size_ ; i < size ; i){ ? ? ? ? ? ? ? ? ? ?T *obj = new(buffer[i*duration])T();//使用buffer[i * duration]內存塊去創建對象 ? ? ? ? ? ? ? ?} ? ? ? ? ? ?} ? ? ? ? ? ?else{ ? ? ? ? ? ? ? ?for(int i = size_ - ?1; i >= size ; --i){ ? ? ? ? ? ? ? ? ? ?T *obj = (T*) buffer[ i* duration]; ? ? ? ? ? ? ? ? ? ?obj->~T();//調用析構} ? ? ? ? ? ?} ? ? ? ?}};

2.2 constructor

基本構造函數


有四種如下的方式,其中特別注意使用iterator的方式進行copy construct的時候,也可以直接傳遞數組地址過去,會自動轉換

// constructors used in the same order as described above: ?std::vector<int> first; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// empty vector ?std::vector<int> second (4,100); ? ? ? ? ? ? ? ? ? ? ? // four ints with value 100 ?std::vector<int> third (second.begin(),second.end()); ?// iterating through second ?std::vector<int> fourth (third); ? ? ? ? ? ? ? ? ? ? ? // a copy of third // the iterator constructor can also be used to construct from arrays: ?int myints[] = {16,2,77,29}; ?std::vector<int> fifth (myints, myints sizeof(myints) / sizeof(int) );

列表初始化

可以使用c 11的列表初始化進行快速初始化

vector?a{{1},?{2},?{3}};????//加不加括號都一樣vector?a={{1},?{2},?{3}};

2.3 size()和capacity()

size是指當前vector中含有的元素數量,capacity是指vector中擁有的空間

void?resize?(size_type?n);

調整vector的size, 如果size比當前擁有的大,會創建默認對象進行push_back,如果size比當前的小,會縮小size,但是不縮小capacity,創建和釋放會調用構造函數與析構函數

vector?v;v.resize(5);????//調整元素個數void?reserve?(size_type?n);

調整vector的capacity,如果capacity比當前的小,不縮小,反之,則增加capacity

vector?v;v.reserve(5);????//調整容量大下value_type*?data()?noexcept;

返回內存塊的指針首地址

vector?v(10);int?*p?=?v.data();?//獲取內存塊首地址

2.4 element access

reference?at?(size_type?n);

返回對應的位置元素的引用,和[]作用相同,但是會做檢查

總結

以上是生活随笔為你收集整理的C vector详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。