摘要:走近可以膚淺地理解成為靈活的數組,我們在定義數組的時候,是要確定數組的大小的。在內部,向量使用一個動態分配的數組來存儲它們的元素。當插入新元素時,為了增加數組的大小,可能需要重新分配數組,這意味著分配一個新數組并將所有元素移動到該數組中。
hello,大家好,這期文章我們來介紹STL庫中的vector,望對大家有所幫助。下面,讓我們一起來走近它吧。
vector可以膚淺地理解成為靈活的數組,我們在定義數組的時候,是要確定數組的大小的。而vector卻可以根據需要靈活地改變大小。
這是C++官網中對于vector的描述,翻譯過來是:
向量是表示數組的序列容器,數組的大小可以改變。就像數組一樣,vector使用連續的存儲位置來存儲其元素,這意味著也可以使用指向其元素的常規指針上的偏移量來訪問其元素,這和在數組中一樣有效。但與數組不同的是,它們的大小可以動態更改,其存儲由容器自動處理。在內部,向量使用一個動態分配的數組來存儲它們的元素。當插入新元素時,為了增加數組的大小,可能需要重新分配數組,這意味著分配一個新數組并將所有元素移動到該數組中。就處理時間而言,這是一項相對昂貴的任務,因此,vector不會在每次向容器添加元素時重新分配。相反,vector容器可能會分配一些額外的存儲空間來容納可能的增長,因此容器的實際容量可能會大于包含其元素所嚴格需要的存儲空間(即其大小)。庫可以實現增長不同的策略來平衡內存使用和重新分配,但在任何情況下,重新分配應該只發生在對數生長間隔的大小,以便插入單個元素的向量可以提供平攤常數時間復雜度(見push_back方法)。因此,與數組相比,向量消耗更多的內存,以換取管理存儲和以有效方式動態增長的能力。與其他動態序列容器(deque、lists和forward_lists)相比,vector容器訪問其元素非常高效(就像數組一樣),從其末端添加或刪除元素也相對高效。對于在非末端位置插入或刪除元素的操作,它們的性能比其他操作差,迭代器和引用的一致性也比list和forward_lists差。
vector<對象類型>對象名
尖括號用來指定對象類型,后面為定義的對象的名稱。
vector<int>a;vector<double>a;
這兩個例子分別為定義一個int型的向量和定義一個double型的向量。
//無參構造 vector<int>v1; //構造并初始化n個nal; vector<int>v2(10, 0); //拷貝構造 vector<int>v3(v2); //迭代器初始化 vector<int>v4(v2.begin(), v2.end());
我們在這里展示三種遍歷操作。
#include #include using namespace std;int main(){ vector<int>v1(10, 0); //遍歷1 for (size_t i = 0; i < v1.size(); ++i) { cout << v1[i] << " "; } cout << endl; //遍歷2 vector<int>::iterator it1 = v1.begin(); while (it1 != v1.end()) { cout << *it1 << " "; ++it1; } cout << endl; //遍歷3 for (auto e : v1) { cout << e << " "; } cout << endl;}
#include #include using namespace std;int main(){ vector<int>v1(10, 0); vector<int>v2; //數據個數 cout << v1.size() << endl; //容量 cout << v1.capacity() << endl; //判斷是否為空,非空為1,空為0 cout << v1.empty() << endl; cout << v2.empty() << endl; //改變vector的size //第一個參數為改變后的個數,第二個為新增個數的元素 v1.resize(15, 1); cout << v1.size() << endl;; for (auto e : v1) { cout << e << " "; } cout << endl; //改變容量 cout << v1.capacity() << endl; v1.reserve(20); cout << v1.capacity() << endl;}
#include #include using namespace std;int main(){ vector<int>v1; //尾插 v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); for (auto e : v1) { cout << e << " "; } cout << endl; //尾刪 v1.pop_back(); for (auto e : v1) { cout << e << " "; } cout << endl; //查找 vector<int>::iterator pos = find(v1.begin(), v1.end(), 3); cout << *pos << endl; //插入 v1.insert(pos, 0);//在pos位置前插入0 for (auto e : v1) { cout << e << " "; } cout << endl; //刪除 v1.erase(pos);//刪除pos位置的元素 for (auto e : v1) { cout << e << " "; } cout << endl; //交換 vector<int>v2(5, 0); vector<int>v3(5, 1); v2.swap(v3); for (auto e : v2) { cout << e << " "; } cout << endl; for (auto e : v3) { cout << e << " "; } cout << endl; //像數組一樣訪問 v1[1] = 100; for (auto e : v1) { cout << e << " "; } cout << endl;}
好的,在這篇文章中,我們介紹了vector的一些用法,希望對大家有所幫助。這個系列的文章最后都是要分享一首詩的,今天我們來分享陳年喜的炸裂志
早晨起來 頭像炸裂一樣疼這是大機器的額外饋贈不是鋼鐵的錯是神經老了 脆弱不堪我不大敢看自己的生活它堅硬 鉉黑有風鎬的銳角石頭碰一碰 就會流血我在五千米深處打發中年我把巖層一次次炸裂借此 把一生重新組合我微小的親人 遠在商山腳下他們有病 身體落滿灰塵我的中年裁下多少他們的晚年就能延長多少我身體里有炸藥三噸他們是引信部分就在昨夜 在他們床前我巖石一樣 轟地炸裂一地
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119813.html
摘要:拷貝構造函數示例構造無參構造函數總結容器和容器的構造方式幾乎一致,靈活使用即可賦值操作功能描述給容器進行賦值函數原型重載等號操作符將區間中的數據拷貝賦值給本身。清空容器的所有數據刪除區間的數據,返回下一個數據的位置。 ...
摘要:比起和統一的迭代器和引用更好。因此迭代器失效,實際就是迭代器底層對應指針所指向的空間被銷毀了,而使用一塊已經被釋放的空間,造成的后果是程序崩潰即如果繼續使用已經失效的迭代器,程序可能會崩潰。 ...
摘要:可以在接口文件中直接引用庫里的內容,大大方便接口文件的編寫。使用庫里的這里先介紹方式通過創建出來的數組是數組的直接代理,非常底層和高效,但是,它也和數組一樣不安全,一樣沒有邊界檢查。對由于這種情況,可以使用庫里的。 如果你也像我們一樣,同時使用Python和C++,以獲得兩種語言的優勢,一定也會希望尋找一種好的方式集成這兩種語言,相比而言,讓Python能夠方便使用C++的庫更加重要,...
摘要:支持綁定大多數的結構,包括和中引入的。枚舉支持枚舉和枚舉類。雖然還有進一步優化的空間,但到目前為止,它在實際應用程序中的性能已經被證明是完全可以接受的。 翻譯:云荒杯傾 Embind用于綁定C++函數和類到JavaScript,這樣編譯代碼就能在js中以一種很自然的方式來使用。Embind也支持從C++調JavaScript的class。 Embind支持綁定大多數C++的結構,包括C...
閱讀 3273·2021-09-30 09:47
閱讀 2290·2021-09-10 10:51
閱讀 1888·2021-09-08 09:36
閱讀 2925·2019-08-30 12:56
閱讀 3026·2019-08-30 11:16
閱讀 2622·2019-08-29 16:40
閱讀 2993·2019-08-29 15:25
閱讀 1631·2019-08-29 11:02