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()
vectorvec;
vec.push_back(3);
vector::iterator ite=vec.begin();
cout<
vec.push_back(3);
cout<
li.push_back(3);
list::iterator it=li.begin();
cout<
li.push_back(3);
cout<
getchar();
}執行結果是:
有執行結果可以看出vec起初的起始位址是0x310f18,通過插入10000元素後,起始位址變成了0x320020,說明vector起始的容量已經不能滿足再新增10000的要求了,故必須重新開闢一塊記憶體空間來存放元素。同時該程式也說明:vector容器新增元素會使迭代器失效。因為迭代器也是指標,當vector開闢新記憶體空間來存放更多的元素時候,原來的記憶體空間就要被收回了,這時候指向以前記憶體空間的迭代器就成了「野迭代器」了!而list容器迭代器經過增加元素後並沒有失效,這也從側面說明list容器在新增元素(不論新增多少個元素)都不需要移動任何其他元素。
6、容器之間的比較是基於容器內元素的比較。它的比較方法類似於string型別的比較。
7、front和back pk begin和end
front將返回容器內第乙個元素的引用,返回型別是size_type;back將返回容器最後乙個元素的引用,返回型別也是size_type
begin將返回指向容器內第一元素的迭代器,返回型別是iterator;end將返回容器最後乙個元素的下乙個位置的迭代器,返回型別是iterator
8、順序容器中能夠使用下表操作的有vector和deque,但是要注意:容器的下表只能用於獲取已存在的元素,不能用來新增元素。這兩天老是犯這個錯誤,可能陣列毒害太大了!
9、賦值pk swap
賦值操作符首先刪除其左運算元容器中的所有元素,然後將右運算元容器的所有元素插入到左邊容器中:
c1=c2等價於c1.erase(c1.begin(),c2.end());c1.insert(c1.begin(),c2.begin(),c2.end());
c1.swap(c2)作用是交換內容:呼叫完該函式後,c1中存放的是c2原來的元素,c2中存放的則是c1原來的元素。
c++primer上有這樣一段話:該操作不會刪除或插入任何元素,而且保證在常量時間內實現交換。由於容器內沒有移動任何元素,因此迭代器不會失效。讀完就會想:為什麼呢?為什麼沒有元素移動?為什麼迭代器不會失效?我當時猜想應該是:該操作只是把分給兩個容器的記憶體的位址進行交換,來實現內容交換!下面我寫了**驗證這一想法
執行結果是:
讀書筆記(C ) 順序容器
9.1 順序容器的定義 表 9 1 順序容器 vector 支援快速隨機訪問 list 支援快速插入 刪除 deque 雙端佇列 順序容器介面卡 stack lifo queue lifo priority queue 有優先順序管理的佇列 9.1.1 容器元素的初始化 表 9 2 容器建構函式 c...
c 讀書筆記(順序容器)
1 順序容器包括 vector,list,deque 2 接受容器大小做形參的建構函式只適用於順序容器,而關聯容器不支援這種初始化。3 作為容器元素型別必須滿足以下兩個約束 一 元素型別必須支援賦值運算。二 元素型別的物件必須可以複製。上面的兩條是最低限度的元素型別約束。除了引用型別外,所有內建或復...
《C Primer》讀書筆記 第9章 順序容器
順序容器型別 vector 可變大小陣列 deque 雙端佇列 list 雙向列表 forward list 單向列表 c 11新增 array 固定大小陣列 c 11新增 string 與vector相似的容器,但專門用於儲存字元 順序容器選取原則 通常選用vector是最好的選擇,除非你有很好的...