c++中有兩種型別的容器:順序容器和關聯容器。順序容器主要有vector、list、deque等。其中vector表示一段連續的記憶體,基於陣列實現,list表示非連續的記憶體,基於鍊錶實現,deque與vector類似,但是對首元素提供插入和刪除的雙向支援。關聯容器主要有map和set。map是key-value形式,set是單值。map和set只能存放唯一的key,multimap和multiset可以存放多個相同的key。
容器類自動申請和釋放記憶體,因此無需new和delete操作。
一、vector
vector基於模板實現,需包含標頭檔案vector。
1.定義和初始化
//1.定義和初始化
vectorvec1; //預設初始化,vec1為空
vectorvec2(vec1); //使用vec1初始化vec2
vectorvec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
vectorvec4(10); //10個值為的元素
vectorvec5(10,4); //10個值為的元素
//2.常用操作方法
vec1.push_back(100); //新增元素
int size = vec1.size(); //元素個數
bool isempty = vec1.empty(); //判斷是否為空
cout //刪除末尾元素
刪除之間的元素,其他元素前移
cout<<(vec1==vec2)?true:false; //判斷是否相等==、!=、>=、<=...
vector::iterator iter = vec1.begin(); //獲取迭代器首位址
vector::const_iterator c_iter = vec1.begin(); //獲取const型別迭代器
//清空元素
//3.遍歷
//下標法
int length = vec1.size();
for(int i=0;i
coutvector::const_iterator iterator = vec1.begin();
for(;iterator != vec1.end();iterator++)
cout<
三、deque
deque容器類與vector類似,支援隨機訪問和快速插入刪除,它在容器中某一位置上的操作所花費的是線性時間。與vector不同的是,deque還支援從開始端插入資料:push_front()。其餘類似vector操作方法的使用。
四、map
c++中map容器提供乙個鍵值對(key/value)容器,map與multimap差別僅僅在於multiple允許乙個鍵對應多個值。需要包含標頭檔案map。對於迭代器來說,可以修改實值,而不能修改key。map會根據key自動排序。
//1.定義和初始化
mapmap1; //空map
//2.常用操作方法
map1[3] = "saniya"; //新增元素
map1.insert(map::value_type(2,"diyabi"));//插入元素
"siqinsini"));
map1.insert(make_pair(4,"v5"));
string str = map1[3]; //根據key取得value,key不能修改
map::iterator iter_map = map1.begin();//取得迭代器首位址
int key = iter_map->first; //取得eky
string value = iter_map->second; //取得value
map1.erase(iter_map); //刪除迭代器資料
map1.erase(3); //根據key刪除value
map1.size(); //元素個數
map1.empty(); //判斷空
map1.clear(); //清空所有元素
//3.遍歷
for(map::iterator iter = map1.begin();iter!=map1.end();iter++)
{int keyk = iter->first;
string valuev = iter->second;
五、set
set的含義是集合,它是乙個有序的容器,裡面的元素都是排序好的,支援插入,刪除,查詢等操作,就像乙個集合一樣。所有的操作的都是嚴格在logn時間之內完成,效率非常高。set和multiset的區別是:set插入的元素不能相同,但是multiset可以相同。set預設自動排序。使用方法類似list。
六、各種容器總結**自:
(1)vector
內部資料結構:陣列。
隨機訪問每個元素,所需要的時間為常量。
在末尾增加或刪除元素所需時間與元素數目無關,在中間或開頭增加或刪除元素所需時間隨元素數目呈線性變化。
可動態增加或減少元素,記憶體管理自動完成,但程式設計師可以使用reserve()成員函式來管理記憶體。
vector的迭代器在記憶體重新分配時將失效(它所指向的元素在該操作的前後不再相同)。當把超過capacity()-size()個元素插入vector中時,記憶體會重新分配,所有的迭代器都將失效;否則,指向當前元素以後的任何元素的迭代器都將失效。當刪除元素時,指向被刪除元素以後的任何元素的迭代器都將失效。
(2)deque
內部資料結構:陣列。
隨機訪問每個元素,所需要的時間為常量。
在開頭和末尾增加元素所需時間與元素數目無關,在中間增加或刪除元素所需時間隨元素數目呈線性變化。
可動態增加或減少元素,記憶體管理自動完成,不提供用於記憶體管理的成員函式。
增加任何元素都將使deque的迭代器失效。在deque的中間刪除元素將使迭代器失效。在deque的頭或尾刪除元素時,只有指向該元素的迭代器失效。
(3)list
內部資料結構:雙向環狀鍊錶。
不能隨機訪問乙個元素。
可雙向遍歷。
在開頭、末尾和中間任何地方增加或刪除元素所需時間都為常量。
可動態增加或減少元素,記憶體管理自動完成。
增加任何元素都不會使迭代器失效。刪除元素時,除了指向當前被刪除元素的迭代器外,其它迭代器都不會失效。
(4)slist
內部資料結構:單向鍊錶。
不可雙向遍歷,只能從前到後地遍歷。
其它的特性同list相似。
(5)stack
介面卡,它可以將任意型別的序列容器轉換為乙個堆疊,一般使用deque作為支援的序列容器。
元素只能後進先出(lifo)。
不能遍歷整個stack。
(6)queue
介面卡,它可以將任意型別的序列容器轉換為乙個佇列,一般使用deque作為支援的序列容器。
元素只能先進先出(fifo)。
不能遍歷整個queue。
(7)priority_queue
介面卡,它可以將任意型別的序列容器轉換為乙個優先順序佇列,一般使用vector作為底層儲存方式。
只能訪問第乙個元素,不能遍歷整個priority_queue。
第乙個元素始終是優先順序最高的乙個元素。
(8)set
鍵和值相等。
鍵唯一。
元素預設按公升序排列。
如果迭代器所指向的元素被刪除,則該迭代器失效。其它任何增加、刪除元素的操作都不會使迭代器失效。
(9)multiset
鍵可以不唯一。
其它特點與set相同。
(10)hash_set(11)hash_multiset
鍵可以不唯一。
其它特點與hash_set相同。
(12)map
鍵唯一。
元素預設按鍵的公升序排列。
如果迭代器所指向的元素被刪除,則該迭代器失效。其它任何增加、刪除元素的操作都不會使迭代器失效。
(13)multimap
鍵可以不唯一。
其它特點與map相同。
(14)hash_map(15)hash_multimap
鍵可以不唯一。
其它特點與hash_map相同。
C STL基本容器比較
在stl中基本容器有 string vector list deque set map set 和map都是無序的儲存元素,只能通過它提供的介面對裡面的元素進行訪問 set 集合,用來判斷某乙個元素是不是在乙個組裡面,使用的比較少 map 對映,相當於字典,把乙個值對映成另乙個值,如果想建立字典的話...
C STL基本容器比較
摘自 在stl中基本容器有 string vector list deque set map set 和map都是無序的儲存元素,只能通過它提供的介面對裡面的元素進行訪問 set 集合,用來判斷某乙個元素是不是在乙個組裡面,使用的比較少 map 對映,相當於字典,把乙個值對映成另乙個值,如果想建立字...
C STL 容器高效使用
1.容器中物件拷貝高效 防剝離發生的方法 使容器包含指標而不是物件。ps stl容器是在建立拷貝,相比陣列,是動態建立,節省時間和空間 2.總是呼叫empty 而不是size 0來判斷容器是否為空 empty 對所有stl容器都是常數時間操作,而size 對某些容器 如list 是線性時間操作,si...