天天看點

c++标準庫順序容器vector,deque,list

順序容器 Vector deque List
記憶體形式

類似加強版的隊列

配置設定一塊連續的記憶體,元素被順序存儲。當數值記憶體不夠時,vector會重新申請一塊足夠大的連續記憶體,把原來的資料拷貝到新的記憶體裡面。當向vector插入或者删除一個元素時,需要複制移動待插入元素右邊的所有元素。

雙向隊列

在配置設定記憶體的時候,使用了MAP的結構和方法。化整為零,配置設定了許多小的連續空間。從deque兩端添加、删除元素十分友善,同時支援随機通路。

雙向連接配接表

在記憶體中不一定連續。list因為不用考慮記憶體的連續,是以新增開銷比vector小。list隻能通過指針通路元素,随機通路元素的效率特别低。

特點 支援快速随機通路 雙端隊列 支援快速插入/删除
容器對象初始化
通用 C<T> c;C c(c2);C c(b,e);C c(n,t);C c(n);
疊代器和疊代器範圍
通用

*iter;iter->mem;++iter/iter++;--iter/iter--;iter1 ==

iter2/iter1 !=iter2;

特有

iter + n;

iter - n;

iter1 +=iter2;

iter1 -=iter2;

iter1 - iter2;

>, >=,<, <=;

容器操作
通用

疊代器:c.begin();c.end();c.rbegin();c.rend();

通路元素:c.push_back(t);c.push_front(t);c.insert(p,t);c.insert(p,n,t);c.insert(p,b,e);

容器大小:c.size();c.max_size();c.empty();c.resize(n);c.resize(n,t);

通路元素:c.back();c.front();

删除元素:c.erase(p);c.erase(b,e);c.clear();c.pop_back();

指派:c1 = c2;c1.swap(c2);c.assign(b,e);c.assign(n,t);

特有 通路元素:c[n];c.at(n); 删除元素:c.pop_front();
容器的選擇

通常來說,除非找到選擇使用其他容器的更好理由,否則 vector 容器都是最佳選擇。

1. 如果程式要求随機通路元素,則應使用 vector 或 deque 容器。

2. 如果程式必須在容器的中間位置插入或删除元素,則應采用 list 容器。

3. 如果程式不是在容器的中間位置,而是在容器首部或尾部插入或删除元

素,則應采用 deque 容器。

4. 如果隻需在讀取輸入時在容器的中間位置插入元素,然後需要随機通路元

素,則可考慮在輸入時将元素讀入到一個 list 容器,接着對此容器重新

排序,使其适合順序通路,然後将排序後的 list 容器複制到一個 vector容器。

繼續閱讀