一、各個順序容器效能差異主要體現在一下兩個方面:
1.在容器中任意位置新增和刪除元素的代價
2.隨機訪問容器中元素的代價
vector、list、deque、forward_list、array、string
vector是可變大小陣列,支援快速隨機訪問,在尾部插入和刪除元素較為方便
list是雙向鍊錶,只支援雙向順序訪問,在任意位置插入和刪除元素都比較方便
deque是雙端佇列,支援快速隨機訪問,在頭尾位置插入和刪除元素較為方便
forward_list是單向鍊錶,只支援單向順序訪問。在任意位置插入和刪除元素都比較方便
array是固定大小的陣列,支援快速隨機訪問。不能新增和刪除元素
string是專門用於儲存char的vector,支援快速隨機訪問,在尾部插入和刪除元素較為方便
對於vector和string由於是在記憶體中連續儲存,所以可以根據下標來計算位址進行訪問,在中間刪去和新增某一元素,其後面位置都要進行移動以保持連續儲存。
list、forward_list主要用於解決在容器任意位置插入和刪除元素代價大的問題,但其後果是訪問任一元素較為麻煩,需要對整個容器進行遍歷後才可以,並且其額外記憶體開銷較大。
deque是一種較為複雜的資料結構,在中間位置新增和刪除元素代價較高,但在兩端新增和刪除元素較為方便,速度與list和forward_list較為接近。
二、關於容器的選用基本原則:
1.除非有很好的理由選用其他容器,否則使用vector
2.容器元素很多,且對空間開銷比較敏感,則不要使用list和forward_list
3.如果要求隨機訪問,則使用vector或string,如果要求在中間位置插入和刪除方便,則使用list和forward_list
4.只在頭尾位置插入和刪除元素,使用deque
5.如果既要求能隨機訪問容器中元素,又要求可以在任意位置新增和刪除元素,那就要看在工程中佔主導地位的是隨機訪問還是任意位置插入、刪除(看二者哪個操作需要的更更加頻繁),視情況選擇vector或者list
三、容器操作層次
幾乎可以在容器中儲存所有型別的資料
如果出現此種情況,nodefault為無建構函式型別
vectora(10, init);//正確
vectorb(10);//錯誤
1、對所有容器都通用的操作
iterator 迭代器
const_iterator 唯讀迭代器
size_type 無符號整數型別//足夠存放任何容器物件的大小 例如:string::type
difference_type 帶符號整數型別
value_type 元素型別
reference 元素左值型別 //元素型別的乙個引用
const_referemce 元素const左值型別
2、僅僅適用於順序容器、適用於關聯容器、適用於無序容器
3、只適用於一小部分容器
四、容器定義與初始化
1、c c;
c c1(c2);
c c {};
c c (a,b);//ab均為迭代器
c c(n,t);
c c(n);
#include
#include
#include
#include
using namespace std;
int main()
;list::iterator it = a.begin();
it++;
it++;
listb(a.begin(), it);
for (list::iterator it1 = b.begin(); it1 != b.end(); it1++)
return 0;
}輸出結果為:aaa bbb
2、array定義與初始化稍有不同 ,因為array長度固定
array必須加上10
與內建陣列區別:可以直接進行拷貝
int a = ;
int b = a//錯誤錯誤
arraya= ;
arrayb = a; //正確
五、賦值和swap
1、assign用法:
listnames;
vectoroldstyle;
names.assign(oldstyle.begin(),oldstyle.end()); //注意:容器型別可以不同
listslist(1);
slist.assign(10,"hhhh");
2、swap用法
交換兩個相同型別的容器的內容
vectorsevc1(10);
vectorsevc2(24);
swap(sevc1, sevc2);
呼叫swap之後,元素本身並未交換,只是交換了整個容器的資料結構
迭代器、指標、引用等仍然指向原來的元素 比如指標a原來指向sevc1[3] 現在指向sevc2[3]
string有所不同,對string容器呼叫swap後,這些都將失效
而對array來說,則會真正交換二者的元素。
3、容器大小操作
容器關係運算子比較大小、實際為容器中元素的逐個比較
六、順序容器操作
1、新增元素
push_back除去array與forward_list都支援 本質是在容器尾部建立了乙個新的元素,容器的size增大了1
對容器進行初始化實際上放入容器的是元素的乙個拷貝,而不是元素本身
push_front deque、list、forward_list支援
insert提供了更一般的新增功能,允許我們在容器任意位置進行元素新增(用該方法對所有順序容器都是有效的,只是相對來說,vector、string、deque更耗時)
slist.insert(iter,"aaa");//iter為容器型別的迭代器
slist.insert(slist.end(),10,"aaa");
insert返回值為指向剛剛插入的元素的迭代器
emplace_front、emplace、emplace_back
與push、insert區別:如果容器型別不是內建型別的話 前者將引數傳遞給建構函式,然後函式實現在容器末尾新增新構造元素;後者要進行賦值、移動等。
2、訪問元素
front與back成員函式分別返回首元素和尾元素的引用
注意與begin和end的區別
begin函式:
函式原型:
iterator begin();
const_iterator begin();
功能:返回乙個當前vector容器中起始元素的迭代器。
end函式:
函式原型:
iterator end();
const_iterator end();
功能:返回乙個當前vector容器中末尾元素的迭代器。
front函式:
函式原型:
reference front();
const_reference front();
功能:返回當前vector容器中起始元素的引用。
back函式:
函式原型:
reference back();
const_reference back();
功能:返回當前vector容器中末尾元素的引用。
at(n)函式僅僅適用於string、vector、deque、array 如果下標越界,at()會丟擲異常
3、刪除元素
pop_back()
pop_front()
erase(p)//p為迭代器 刪除p指向的元素 函式返回值為指向刪除元素下乙個元素的迭代器
erase(b,e)//刪除b、e所指定範圍內元素
clear()
七、特殊的forward_list
forward_lista;
auto p1 = a.before_begin();
auto p2 = a.begin();
while (p2 != a.end())
else
}八、容器介面卡
三個容器介面卡:
stack、queue、priority_queue
乙個介面卡是一種機制,能使某種事物的行為看起來像另外一種事物一樣
size_type
value_type
container_type
a a;
a a(c);
a.empty();
a.size();
swap(a,b);
a.swap(b);
兩個建構函式
預設建構函式接受乙個空物件,接受乙個容器的建構函式拷貝該容器來初始化介面卡。
dequedeq;
stackstk(deq);
C 順序容器
一 順序容器型別 順序容器 vector list deque 介面卡 stack queue priority queue 使用這些容器都必須使用相應的標頭檔案 二 容器元素初始化 cc 建立乙個名為c的空容器 cc c2 建立容器c2的副本 cc b,e 建立c,其元素是迭代器b和e的範圍內的副...
C 順序容器
1 概述 乙個容器就是一些特定型別物件的集合。順序容器型別 描述vector 可變大小陣列,支援快速訪問,在尾部之外的地方插入或刪除時可能很慢 deque 雙端佇列。支援快速訪問,在頭尾插入刪除會很快。list 雙向列表。只支援雙向順序訪問。插入刪除很快 forward list 單向列表。只支援單...
c 順序容器
1.幾種順序容器的比較 容器本質 特點適用範圍 vector 可變大小陣列 連續儲存,快速隨機訪問,除尾部插入刪除慢 預設使用 deque 雙端佇列 快速隨機訪問,除首尾插入刪除慢 兩端都需要新增刪除元素 list 雙向鍊錶 不支援隨機訪問 只能遍歷 插入刪除迅速,額外記憶體開銷大 需要中間插入元素...