本文參考了
1、順序容器包括:vector,list,deque
2、接受容器大小做形參的建構函式只適用於順序容器,而關聯容器不支援這種初始化。
3、作為容器元素型別必須滿足以下兩個約束:
一、元素型別必須支援賦值運算。
二、元素型別的物件必須可以複製。
上面的兩條是最低限度的元素型別約束。除了引用型別外,所有內建或復合型別都可用做元素型別。
4、只有vector和deque容器提供以下兩種重要的運算集合:
一、迭代器算術運算:iter+n
iter-n
iter1+=iter2
iter1-=iter2
iter1-iter2
二、除了==和!=之外的關係操作符來比較兩個迭代器:>、>=、
5、關於新增,插入或刪除元素可能會使迭代器失效
關於這個問題首先要弄清楚vector,list,deque在記憶體中是怎樣儲存的:
vector容器的元素以連續的方式存放——每乙個元素都緊挨著前乙個元素儲存。所以當容器中已經沒有空間容納新的元素,vector必須重新分配儲存空間,用來存放原來的元素以及新新增的元素。在vector中某個位置插入乙個元素時,該位置後面的元素都要向後移動了。刪除某個元素道理與插入一樣。
list容器表示不連續的記憶體區域,list儲存類似於鍊錶,故插入或刪除list容器中的乙個元素不需要移動任何其他元素。
下面我給出兩端**來證明vector和list的儲存方式:
#include
#include
#include
using namespace std;
int main()
執行結果是:
這樣明白了吧:swap交換的不是兩個容器中的內容而是兩個容器中儲存的位址!所以這樣交換前的迭代器也不會失效了!
再貼乙個程式例項:
#include
#include
#include
#include
int main()
// vector
std::vectormyvector;
// 乙個 vector 就像乙個動態的一維陣列19樓空間'qe7mei2fa@
// 宣告乙個存放 100 個 0 的整數的 vector
// 返回 vector 的大小, 即元素的個數
std::cout << myvec.size() << std::endl;
// 刪除 vector 末尾的元素, vector 的大小相應減1
myvec.pop_back();
// 在 vector 的末尾新增元素
myvec.push_back(10);
// 返回 vector 末尾的元素
std::cout << myvec.back() << std::endl;
// 清除 vector 所有元素, vector 的個數為 0
myvec.clear();
std::cout << myvec.size() << std::endl;
// std::cout << myvec[1] << std::endl; //這種方法訪問越界會異常
// std::cout << myvec.at(5) << std::endl; //這種方法訪問越界會異常
// 遍歷
// 遍歷方法1, 推薦
for(std::vector::iterator iter_1 = myvec.begin(); iter_1 != myvec.end(); iter_1++)
std::cout << (int)*iter_1 << std::endl;
// 遍歷方法2, 不推薦, 原因忘記
for(int i = 0; i <= myvec.size(); i++)
std::cout << myvec[i] << std::endl;
// set
// set 是集合, 但 set中不能包含重複的元素, 這是與 vector 的區別
std::setmyset;
myset.insert(10); // 插入元素19樓空間w1rn j3a
myset.insert(10); // 沒用, 插入失敗, 因為不能有重複元素
myset.erase(10); // 刪除元素,如果元素存在的話
myset.size();
myset.clear();
// list 相當於乙個列表
std::listmylist;
mylist.push_back(100);
mylist.remove(100);
/** vector用的是隨機訪問迭代器,list用的是雙向迭代器
*
* 如果我們需要隨機訪問乙個容器則vector 要比list 好得多
* 如果我們已知要儲存元素的個數則vector 又是乙個比list 好的選擇
* 如果我們需要的不只是在容器兩端插入和刪除元素則list 顯然要比vector 好
* 除非我們需要在容器首部插入和刪除元素否則vector 要比deque 好
8]u;k z*c;r{0 */
return 0;
幾種順序容器的有缺點:
vector 就是一頭開口的佇列,所以就是一般意義上的佇列。
deque 是兩頭開口的。既能往前插也能往後插。
但是它兩都一樣,如果非要往中間插,就得騰地。vector 沒辦法,不管往哪插都得往後挪,所以你往第乙個插最慘,整個序列都要複製。deque 好一點,如果你插入的位置比較靠前,它會想辦法把前面的部分往前挪來騰地。所以最慘的是往中間插。
但是它們的訪問效率都很高,vector 只要用首位址,加偏移量就可以直接找到要訪問的元素。deque 稍微複雜,但總的來說,訪問的位置也是直接算出來的,所以它們的訪問時間都是常數 o(1)。
list 和它們思路不一樣。你可以自由的在任何位置插入,插入時間是常數。但訪問很慢,它根本不知道你要找的元素在**,只能從頭遍歷。
關於C 中的容器
關於c 中的容器 c 中的容器類包括 順序儲存結構 和 關聯儲存結構 前者包括vector,list,deque等 後者包括set,map,multiset,multimap等。若需要儲存的元素數在編譯器間就可以確定,可以使用陣列來儲存,否則,就需要用到容器類了。1 vector 連續儲存結構,每個...
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 單向列表。只支援單...