C 順序容器

2021-07-16 12:10:26 字數 4378 閱讀 4697

一、各個順序容器效能差異主要體現在一下兩個方面:

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 雙向鍊錶 不支援隨機訪問 只能遍歷 插入刪除迅速,額外記憶體開銷大 需要中間插入元素...