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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++容器亲自总结

發布時間:2023/12/18 c/c++ 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++容器亲自总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、容器的定義

? ? ? ?在數據存儲上,有一種對象類型,它可以持有其它對象或指向其它對像的指針,這種對象類型就叫做容器。很簡單,容器就是保存其它對象的對象,當然這是一個樸素的理解,這種“對象”還包含了一系列處理“其它對象”的方法。

二、容器的種類

????????1、順序容器:是一種各元素之間有順序關系的線性表,是一種線性結構的可序群集。順序性容器中的每個元素均有固定的位置,除非用刪除或插入的操作改變這個位置。順序容器的元素排列次序與元素值無關,而是由元素添加到容器里的次序決定。順序容器包括:vector(向量)、list(列表)、deque(隊列)。
????????2、關聯容器:關聯式容器是非線性的樹結構,更準確的說是二叉樹結構。各元素之間沒有嚴格的物理上的順序關系,也就是說元素在容器中并沒有保存元素置入容器時的邏輯順序。但是關聯式容器提供了另一種根據元素特點排序的功能,這樣迭代器就能根據元素的特點“順序地”獲取元素。元素是有序的集合,默認在插入的時候按升序排列。關聯容器包括:map(集合)、set(映射)、multimap(多重集合)、multiset(多重映射)。
????????3、容器適配器:本質上,適配器是使一種不同的行為類似于另一事物的行為的一種機制。容器適配器讓一種已存在的容器類型采用另一種不同的抽象類型的工作方式實現。適配器是容器的接口,它本身不能直接保存元素,它保存元素的機制是調用另一種順序容器去實現,即可以把適配器看作“它保存一個容器,這個容器再保存所有元素”。STL 中包含三種適配器:棧stack 、隊列queue 和優先級隊列priority_queue 。

????????4、容器類自動申請和釋放內存,因此無需new和delete操作。

? ? ? ?

三、不同容器的使用方法

? 1、vector

? ? ? ?①定義與初始化(需要導入頭文件#include <vector>)

? ? ? ? ? ??如果沒有指定元素的初始化式,那么標準庫將自行提供一個元素初始值進行,具體值為何,取決于存儲在vector 中元素的數據類型;如果為int型數據,那么標準庫將用 0 值創建元素初始化式;如果 vector 保存的是含有構造函數的類類型(如 string)的元素,標準庫將用該類型的默認構造函數創建元素初始化式;元素類型可能是沒有定義任何構造函數的類類型。這種情況下,標準庫仍產生一個帶初始值的對象,這個對象的每個成員進行了值初始化。

vector<int> vec1; //默認初始化,vec1為空vector<int> vec2(vec1); //使用vec1初始化vec2vector<int> vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2vector<int> vec4(10); //10個值為0的元素vector<int> vec5(10,4); //10個值為4的元素vector<string> vec6(10,"null"); //10個值為null的元素vector<string> vec7(10,"hello"); //10個值為hello的元素

? ? ? ②常用的操作方法

vec1.push_back(100); //添加元素int size = vec1.size(); //元素個數bool isEmpty = vec1.empty(); //判斷是否為空cout<<vec1[0]<<endl; //取得第一個元素vec1.insert(vec1.end(),5,3); //從vec1.back位置插入5個值為3的元素vec1.pop_back(); //刪除末尾元素vec1.erase(vec1.begin(),vec1.end());//刪除之間的元素,其他元素前移cout<<(vec1==vec2)?true:false; //判斷是否相等==、!=、>=、<=...vector<int>::iterator iter = vec1.begin(); //獲取迭代器首地址vector<int>::const_iterator c_iter = vec1.begin(); //獲取const類型迭代器vec1.clear(); //清空元素

????????③遍歷方法

// 下標法(vector的特有訪問方法,一般容器只能通過迭代器訪問)int length = vec1.size();for ( int i=0;i<length;i++){cout<<vec1[i];}cout<<endl<<endl;// 迭代器法vector< int >::const_iterator iterator = vec1.begin();for (;iterator != vec1.end();iterator++){cout<<*iterator;}

2、list

?????? ①定義與初始化(需要導入頭文件#include <list>)

list<int> lst1; //創建空listlist<int> lst2(3); //創建含有三個元素的listlist<int> lst3(3,2); //創建含有三個元素的值為2的listlist<int> lst4(lst2); //使用lst2初始化lst4list<int> lst5(lst2.begin(),lst2.end()); //同lst4

?????? ②常用的操作方法

lst1.assign(lst2.begin(),lst2.end()); //分配值lst1.push_back(10); //添加值lst1.pop_back(); //刪除末尾值lst1.begin(); //返回首值的迭代器lst1.end(); //返回尾值的迭代器lst1.clear(); //清空值bool isEmpty1 = lst1.empty(); //判斷為空lst1.erase(lst1.begin(),lst1.end()); //刪除元素lst1.front(); //返回第一個元素的引用lst1.back(); //返回最后一個元素的引用lst1.insert(lst1.begin(),3,2); //從指定位置插入3個值為2的元素lst1.rbegin(); //返回第一個元素的前向指針lst1.remove(2); //相同的元素全部刪除lst1.reverse(); //反轉lst1.size(); //含有元素個數lst1.sort(); //排序lst1.unique(); //刪除相鄰重復元素

?????? ③遍歷方法

//迭代器法for(list<int>::const_iterator iter = lst1.begin();iter != lst1.end();iter++) {cout<<*iter; } cout<<endl;

? 3、deque

?????? deque容器類與vector類似,支持隨機訪問和快速插入刪除,它在容器中某一位置上的操作所花費的是線性時間。與vector不同的是,deque還支持從開始端插入數據:push_front()。其余類似vector操作方法的使用。(需要導入頭文件#include <deque>)

4、順序容器使用方法小結

?????? ①添加元素

函數名 意義 c.push_back(t) 在容器c的尾部添加值為t的元素。返回void 類型c.push_front(t) 在容器c的前端添加值為t的元素。返回void 類型只適用于list和deque容器類型。c.insert(p,t) 在迭代器p所指向的元素前面插入值為t的新元素。返回指向新添加元素的迭代器。c.insert(p,n,t) 在迭代器p所指向的元素前面插入n個值為t的新元素。返回void 類型c.insert(p,b,e) 在迭代器p所指向的元素前面插入由迭代器b和e標記的范圍內的元素。返回 void 類型//在容器首部或者尾部添加數據 list<int> ilist; ilist.push_back(ix);//尾部添加 ilist.push_front(ix);//首部添加 //在容器中指定位置添加元素 list<string> lst; list<string>::iterator iter = lst.begin(); while (cin >> word) iter = lst.insert(iter, word); // 和push_front意義一樣 //插入一段元素 list<string> slist; string sarray[4] = {"quasi", "simba", "frollo", "scar"}; slist.insert(slist.end(), 10, "A");//尾部前添加十個元素都是A list<string>::iterator slist_iter = slist.begin(); slist.insert(slist_iter, sarray+2, sarray+4);//指針范圍添加

??????? ②容器大小的操作

函數名 意義 c.size() 返回容器c中元素個數。返回類型為 c::size_typec.max_size() 返回容器c可容納的最多元素個數,返回類型為c::size_typec.empty() 返回標記容器大小是否為0的布爾值c.resize(n) 調整容器c的長度大小,使其能容納n個元素,如果n<c.size(),則刪除多出來的元素;否則,添加采用值初始化的新元素c.resize(n,t) 調整容器c的長度大小,使其能容納n個元素。所有新添加的元素值都為tlist<int> ilist(10, 1); ilist.resize(15); // 尾部添加五個元素,值都為0 ilist.resize(25, -1); // 再在尾部添加十個元素,元素為-1 ilist.resize(5); // 從尾部刪除20個元素

????????③訪問元素

函數名 意義 c.back() 返回容器 c 的最后一個元素的引用。如果 c 為空,則該操作未定義c.front() 返回容器 c 的第一個元素的引用。如果 c 為空,則該操作未定義 c[n] 返回下標為 n 的元素的引用。如果 n <0 或 n >= c.size(),則該操作未定義只適用于 vector 和 deque 容器c.at(n) 返回下標為 n 的元素的引用。如果下標越界,則該操作未定義只適用于 vector 和 deque 容器vector<int> vi; for(int i=0;i<10;i++)vi.push_back(i); cout<<vi[0]<<endl; cout<<vi.at(0)<<endl; cout<<vi[10]<<endl; //越界錯誤 cout<<vi.at(10)<<endl;//越界錯誤

????????④ 刪除元素

函數名 意義 c.erase(p) 刪除迭代器p所指向的元素。返回一個迭代器,它指向被刪除元素后面的元素。如果p指向容器內的最后一個元素,則返回的迭代器指向容器超出末端的下一位置。如果p本身就是指向超出末端的下一位置的迭代器,則該函數未定義c.erase(b,e) 刪除迭代器b和e所標記的范圍內所有的元素。返回一個迭代器,它指向被刪除元素段后面的元素。如果e本身就是指向超出末端的下一位置的迭代器,則返回的迭代器也指向容器的超出末端的下一位置c.clear() 刪除容器c內的所有元素。返回void c.pop_back() 刪除容器c的最后一個元素。返回void。如果c為空容器,則該函數未定義c.pop_front() 刪除容器c的第一個元素。返回void。如果c為空容器,則該函數未定義只適用于 list 或 deque 容器//刪除第一個或最后一個元素 list<int> li; for(int i=0;i<10;i++)list.push_back(i); li.pop_front();//刪除第一個元素 li.pop_back(); //刪除最后一個元素 //刪除容器內的一個元素 list<int>::iterator iter =li.begin(); if(iter!= li.end())li.erase(iter); //刪除容器內所有元素 li.clear();

????????⑤賦值與swap

函數名 意義 c1 = c2 刪除容器c1的所有元素,然后將c2的元素復制給c1。c1和c2的類型(包括容器類型和元素類型)必須相同c1.swap(c2) 交換內容:調用完該函數后,c1中存放的是 c2 原來的元素,c2中存放的則是c1原來的元素。c1和c2的類型必須相同。該函數的執行速度通常要比將c2復制到c1的操作快c.assign(b,e) 重新設置c的元素:將迭代器b和e標記的范圍內所有的元素復制到c中。b和e必須不是指向c中元素的迭代器c.assign(n,t) 將容器c重新設置為存儲n個值為t的元素list<string> sl1,sl2; for(int i=0;i<10;i++)sl2.push_back("a"); sl1.assign(sl2.begin(),sl2.end());//用sl2的指針范圍賦值,sl1中十個元素都為a sl1.assign(10, "A"); //s1被重新賦值,擁有十個元素,都為Avector<string> vs1(3); // vs1有3個元素 vector<string> vs(5); // vs2有5個元素 vs1.swap(vs2);//執行后,vs1中5個元素,而vs2則存3個元素。

5、map

????????(需要導入頭文件#include <map>)
?????? C++中map容器提供一個鍵值對(key/value)容器,map與multimap差別僅僅在于multiple允許一個鍵對應多個值。對于迭代器來說,可以修改實值,而不能修改key。Map會根據key自動排序。??? ?
??????? map 是鍵-值對的集合。map 類型通常可理解為關聯數組:可使用鍵作為下標來獲取一個值,正如內置數組類型一樣。而關聯的本質在于元素的值與某個特定的鍵相關聯,而并非通過元素在數組中的位置來獲取。

?????? ①定義與初始化

map<int,string> map1; //空map函數名 意義 map<k, v>m創建一個名為m的空map對象,其鍵和值的類型分別為k和vmap<k, v>m(m2)創建m2的副本m,m與m2必須有相同的鍵類型和值類型map<k, v>m(b, e)創建map類型的對象m,存儲迭代器b和e標記的范圍內所有元素的副本。元素的類型必須能轉換為pair<const k, v>

?????? 在使用關聯容器時,它的鍵不但有一個類型,而且還有一個相關的比較函數。所用的比較函數必須在鍵類型上定義嚴格弱排序(strict weak ordering):可理解為鍵類型數據上的“小于”關系,雖然實際上可以選擇將比較函數設計得更復雜。
?????? 對于鍵類型,唯一的約束就是必須支持 < 操作符,至于是否支持其他的關系或相等運算,則不作要求。

?????? ②常用的操作方法

?????? 添加元素有兩種方法:1、先用下標操作符獲取元素,然后給獲取的元素賦值 2、使用insert成員函數實現
????????下標操作添加元素:如果該鍵已在容器中,則 map 的下標運算與 vector 的下標運算行為相同:返回該鍵所關聯的值。只有在所查找的鍵不存在時,map 容器才為該鍵創建一個新的元素,并將它插入到此 map 對象中。此時,所關聯的值采用值初始化:類類型的元素用默認構造函數初始化,而內置類型的元素初始化為 0。

insert 操作:函數名 意義 m.insert(e) e是一個用在m上的value_type 類型的值。如果鍵(e.first不在m中,則插入一個值為e.second 的新元素;如果該鍵在m中已存在,則保持m不變。該函數返回一個pair類型對象,包含指向鍵為e.first的元素的map迭代器,以及一個 bool 類型的對象,表示是否插入了該元素m.insert(beg,end)beg和end是標記元素范圍的迭代器,其中的元素必須為m.value_type 類型的鍵-值對。對于該范圍內的所有元素,如果它的鍵在 m 中不存在,則將該鍵及其關聯的值插入到 m。返回 void 類型m.insert(iter,e) e是一個用在m上的 value_type 類型的值。如果鍵(e.first)不在m中,則創建新元素,并以迭代器iter為起點搜索新元素存儲的位置。返回一個迭代器,指向m中具有給定鍵的元素例1:word_count.insert(map<string, int >::value_type( "Anna" , 1)); word_count.insert(make_pair( "Anna" , 2));//返回false,且鍵值仍為1. word_count["Anna"] = 2;//鍵值變為2insert的返回值:包含一個迭代器和一個bool值的pair對象,其中迭代器指向map中具有相應鍵的元素, 而bool值則表示是否插入了該元素。 如果該鍵已在容器中,則其關聯的值保持不變,返回的bool值為false。 在這兩種情況下,迭代器都將指向具有給定鍵的元素。例2: pair<map<string, int >::iterator, bool > ret = word_count.insert(make_pair(word, 1));ret存儲insert函數返回的pair對象。該pair的first成員是一個map迭代器,指向插入的鍵。 ret.first從insert返回的pair對象中獲取 map 迭代器;ret.second從insert返回是否插入了該元素。例3:map1[3] = "Saniya"; //添加元素map1.insert(map<int,string>::value_type(2,"Diyabi"));//插入元素map1.insert(pair<int,string>(1,"Siqinsini"));map1.insert(make_pair<int,string>(4,"V5"));string str = map1[3]; //根據key取得value,key不能修改map<int,string>::iterator iter_map = map1.begin();//取得迭代器首地址int key = iter_map->first; //取得keystring value = iter_map->second; //取得valuemap1.erase(iter_map); //刪除迭代器數據map1.erase(3); //根據key刪除valuemap1.size(); //元素個數map1.empty(); //判斷空map1.clear(); //清空所有元素

????????③遍歷

??? map中使用下標存在一個很危險的副作用:如果該鍵不在 map 容器中,那么下標操作會插入一個具有該鍵的新元素。所以map 容器提供了兩個操作:count 和 find,用于檢查某個鍵是否存在而不會插入該鍵。

函數名 意義 m.count(k) 返回 m 中 k 的出現次數m.find(k) 如果m容器中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回超出末端迭器。 例1: int occurs = 0; if (word_count.count("foobar"))occurs = word_count["foobar"]; map<string,int>::iterator it = word_count.find("foobar"); if (it != word_count.end())occurs = it->second;例2: for(map<int,string>::iterator iter = map1.begin();iter!=map1.end();iter++){int keyk = iter->first;string valuev = iter->second;}

????????④從map對象中刪除元素

函數名 意義 m.erase(k) 刪除m中鍵為k的元素。返回size_type類型的值,表示刪除的元素個數 m.erase(p) 從m中刪除迭代器p所指向的元素。p必須指向m中確實存在的元素,而且不能等于m.end()。返回void m.erase(b,e) 從m中刪除一段范圍內的元素,該范圍由迭代器對b和e標記。b和e必須標記m中的一段有效范圍:即b和e都必須指向m中的元素或最后一個元素的下一個位置。而且,b和e要么相等(此時刪除的范圍為空),要么b所指向的元素必須出在e所指向的元素之前。返回 void 類型 string removal_word = "a"; if (word_count.erase(removal_word)) cout << "ok: " << removal_word << " removed\n"; else cout << "oops: " << removal_word << " not found!\n";

6、set

?????? set的含義是集合,它是一個有序的容器,里面的元素都是排序好的,支持插入,刪除,查找等操作,就像一個集合一樣。所有的操作的都是嚴格在logn時間之內完成,效率非常高。set和multiset的區別是:set插入的元素不能相同,但是multiset可以相同。Set默認自動排序。使用方法類似list。(需要導入頭文件#include <set>)

?????? ①set容器的定義和使用

?????????? set 容器的每個鍵都只能對應一個元素。以一段范圍的元素初始化set對象,或在set對象中插入一組元素時,對于每個鍵,事實上都只添加了一個元素。

vector< int > ivec;for (vector< int >::size_type i = 0; i != 10; ++i) {ivec.push_back(i);ivec.push_back(i);}set< int > iset(ivec.begin(), ivec.end());cout << ivec.size() << endl; //20個cout << iset.size() << endl; // 10個

?????? ②在set中添加元素

set<string> set1;set1.insert( "the" ); //第一種方法:直接添加set< int > iset2;iset2.insert(ivec.begin(), ivec.end()); //第二中方法:通過指針迭代器

??????? ③從set中獲取元素

??????? set 容器不提供下標操作符。為了通過鍵從 set 中獲取元素,可使用 find運算。
如果只需簡單地判斷某個元素是否存在,同樣可以使用 count 運算,返回 set 中該鍵對應的元素個數。當然,對于 set 容器,count 的返回值只能是1(該元素存在)或 0(該元素不存在)。

set< int > iset; for ( int i = 0; i<10; i++)iset.insert(i); iset.find(1) // 返回指向元素內容為1的指針iset.find(11) // 返回指針iset.end()iset.count(1) // 存在,返回1iset.count(11) // 不存在,返回0set<int>::iterator it=iset.begin() *it就是當前迭代器指向的值set默認是從小到大排列值,定義時set<int,greater<int>> iset;則此時默認是從大到小排列值。

????????④迭代器的關聯容器操作

函數名 意義 m.lower_bound(k) 返回一個迭代器,指向鍵不小于 k 的第一個元素m.upper_bound(k) 返回一個迭代器,指向鍵大于 k 的第一個元素 m.equal_range(k) 返回一個迭代器的 pair 對象。它的 first 成員等價于 m.lower_bound(k)。而 second 成員則等價于 m.upper_bound(k)


四、各種容器的元素在內存中的儲存方式

????????1、vector(向量):相當于數組,但其大小可以不預先指定,并且自動擴展。它可以像數組一樣被操作,由于它的特性我們完全可以將vector 看作動態數組。在創建一個vector 后,它會自動在內存中分配一塊連續的內存空間進行數據存儲,初始的空間大小可以預先指定也可以由vector 默認指定,這個大小即capacity ()函數的返回值。當存儲的數據超過分配的空間時vector 會重新分配一塊內存塊,但這樣的分配是很耗時的,效率非常低。


????????2、deque(隊列):它不像vector 把所有的對象保存在一塊連續的內存塊,而是采用多個連續的存儲塊,并且在一個映射結構中保存對這些塊及其順序的跟蹤。向deque 兩端添加或刪除元素的開銷很小,它不需要重新分配空間。


????????3、list(列表):是一個線性鏈表結構,它的數據由若干個節點構成,每一個節點都包括一個信息塊(即實際存儲的數據)、一個前驅指針和一個后驅指針。它無需分配指定的內存大小且可以任意伸縮,這是因為它存儲在非連續的內存空間中,并且由指針將有序的元素鏈接起來。


????????4、set, multiset, map, multimap 是一種非線性的樹結構,具體的說采用的是一種比較高效的特殊的平衡檢索二叉樹—— 紅黑樹結構。

五、各種容器優劣分析

1、Vector:

??????? 優點:
????????? A、支持隨機訪問,訪問效率高和方便,它像數組一樣被訪問,即支持[ ] 操作符和vector.at()。
????????? B、節省空間,因為它是連續存儲,在存儲數據的區域都是沒有被浪費的,但是要明確一點vector 大多情況下并不是滿存的,在未存儲的區域實際是浪費的。
????????缺點:
????????? A、在內部進行插入、刪除操作效率非常低。
????????? B、只能在vector 的最后進行push 和pop ,不能在vector 的頭進行push 和pop 。
????????? C、 當動態添加的數據超過vector 默認分配的大小時要進行內存的重新分配、拷貝與釋放,這個操作非常消耗能。

2、List:

????????優點:
? ??????? A、不使用連續的內存空間這樣可以隨意地進行動態操作,插入、刪除操作效率高;
????????缺點:
? ????????A、不能進行內部的隨機訪問,即不支持[ ] 操作符和vector.at(),訪問效率低。
? ????????B、相對于verctor 占用更多的內存。

3、Deque:

????????優點:
? ????????A、支持隨機訪問,方便,即支持[ ] 操作符和vector.at() ,但性能沒有vector 好;
? ????????B、可以在兩端進行push 、pop 。
????????缺點:
? ??????? A、在內部進行插入、刪除操作效率低。

綜合:

????????vector 的查詢性能最好,并且在末端增加數據也很好,除非它重新申請內存段;適合高效地隨機存儲。
????????list 是一個鏈表,任何一個元素都可以是不連續的,但它都有兩個指向上一元素和下一元素的指針。所以它對插入、刪除元素性能是最好的,而查詢性能非常差;適合 大量地插入和刪除操作而不關心隨機存取的需求。
????????deque 是介于兩者之間,它兼顧了數組和鏈表的優點,它是分塊的鏈表和多個數組的聯合。所以它有被list 好的查詢性能,有被vector 好的插入、刪除性能。 如果你需要隨即存取又關心兩端數據的插入和刪除,那么deque 是最佳之選。關聯容器的特點是明顯的,相對于順序容器,有以下幾個主要特點:
????????A, 其內部實現是采用非線性的二叉樹結構,具體的說是紅黑樹的結構原理實現的;
????????B, set 和map 保證了元素的唯一性,mulset 和mulmap 擴展了這一屬性,可以允許元素不唯一;
????????C, 元素是有序的集合,默認在插入的時候按升序排列。

基于以上分析

??????? A, 關聯容器對元素的插入和刪除操作比vector 要快,因為vector 是順序存儲,而關聯容器是鏈式存儲;比list 要慢,是因為即使它們同是鏈式結構,但list 是線性的,而關聯容器是二叉樹結構,其改變一個元素涉及到其它元素的變動比list 要多,并且它是排序的,每次插入和刪除都需要對元素重新排序;

????????B, 關聯容器對元素的檢索操作比vector 慢,但是比list 要快很多。vector 是順序的連續存儲,當然是比不上的,但相對鏈式的list 要快很多是因為list 是逐個搜索,它搜索的時間是跟容器的大小成正比,而關聯容器 查找的復雜度基本是Log(N) ,比如如果有1000 個記錄,最多查找10 次,1,000,000 個記錄,最多查找20 次。容器越大,關聯容器相對list 的優越性就越能體現;

????????C, 在使用上set 區別于vector,deque,list 的最大特點就是set 是內部排序的,這在查詢上雖然遜色于vector ,但是卻大大的強于list 。

????????D, 在使用上map 的功能是不可取代的,它保存了“鍵- 值”關系的數據,而這種鍵值關系采用了類數組的方式。數組是用數字類型的下標來索引元素的位置,而map 是用字符型關鍵字來索引元素的位置。在使用上map 也提供了一種類數組操作的方式,即它可以通過下標來檢索數據,這是其他容器做不到的,當然也包括set 。(STL 中只有vector 和map 可以通過類數組的方式操作元素,即如同ele[1] 方式)。

六、關于容器的相關的問題

1、sizeof、size()、capacity問題

vector<int> ivec;cout<<sizeof(ivec)<<endl; // 12cout<<ivec.size()<<endl; // 0cout<<ivec.capacity()<<endl; // 0for(int i=0;i<10;i++)ivec.push_back(1);cout<<sizeof(ivec)<<endl; // 12Cout<<ivec.size()<<endl; // 10cout<<ivec.capacity()<<endl; // 16

總結

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

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