順序容器 - 1【C++ Primer 學習筆記 - 第九章】

順序容器:
vector :  支持快速隨機訪問
list      :  支持快速插入/ 刪除
deque:  雙端隊列    double-ended queue

順序容器適配器
stack  :                  後進先出 (LIFO)棧
queue:                  先進先出 (FIFO)隊列
priority_queue  :  有優先級管理的隊列


所有容器都是類模版。
所有容器都定義了默認的構造函數,用於創建 指定類型的空容器


容器的構造函數
C<T> c; 創建空容器c .C是容器類型,如:vector;  T是元素類型,如:int . 適用所有容器
C<T> c(c2); 創建容器c2 的副本 c; 容器、元素,類型必須完全相同。適用所有容器
C<T> c(b, e); 創建容器c ; 元素是 迭代器b 和 e 範圍內的元素的副本.
容器、元素,類型兼容即可。適用所有容器
C<T> c(n, t); 創建容器c;  包含 n 個值爲 t 的元素. t 必須是元素類型,或者兼容的類型。
只適用於 順序容器
C<T> c(n); 創建容器c;  包含 n 個值初始化元素。只適用於 順序容器






const vector<int>::size_type vector_size = 10;
vector<int> ivec(vector_size, 1);
vector<int> ivec2(ivec);

// extern 關鍵字說明 get_word_count 定義在其他模塊中
extern unsigned get_word_count(const string &file_name);
list<string> slist(get_word_count("zhangwenan"));

list<int> slist2(ivec.begin(), ivec.end());
vector<int>::iterator iter = ivec.begin() + ivec.size()/2;
deque<int> ideque(ivec.begin(), iter);

// 指針,就是迭代器。因此,允許通過內置數組的指針來初始化容器
char *words[] = {"taobao", "baidu", "google"};
size_t word_size = sizeof(words)/sizeof(char *);
list<string> slist3(words, words+word_size);


容器元素的類型,必須滿足2個條件:(這是最低要求,有的容器還會有一些特殊要求)
1、元素類型支持賦值運算,     2、元素類型的對象必須可以複製
引用類型,不支持賦值,  IO 庫類型不支持賦值和運算


容器的容器

vector< vector<string> > lines;


迭代器

常用迭代器運算
*iter 返回迭代器iter指向的元素的引用
iter->mem 等效於(*iter).mem, 解引用並獲取mem成員
++iter
iter++
iter 加1,指向下一個元素
--iter
iter--
iter 減1,指向前一個元素
iter1==iter2
iter1!=iter2
比較是否相等(不等)









vector 和 deque 容器的迭代器提供了額外的運算

vector 和 deque 類型支持的操作
iter+n
iter-n
產生,指向容器中前面(後面)的第n 個元素,的迭代器。不能越界
iter1 += iter2
iter1 -= iter2
複合運算
iter1 - iter2  
>
>=
<
<=
前一個迭代器,小於,後一個迭代器。比如:vec.begin() < vec.end()。不能越界








關係操作符,只適用於 vector 、 deque 容器。因爲,只有這2 種容器爲其元素提供快速、隨機的訪問。

vector<int> vec(10);
vector<int>::iterator iter = vec.begin() + vec.size()/2;

list<int> ilist(vec.begin(), vec.end());
// 以下 Error:因爲,list迭代器,不支持算術運算,也不支持關係運算。
// 只支持,自增、自減、相等、不等,的運算
list<int>::iterator liter = ilist.begin() + ilist.size()/2;


迭代器範圍: [ begin, end) , 左閉合區間。 包括 begin ,但不包括 end

導致迭代器失效的容器操作, 對容器內的元素進行增加、刪除等操作的時候,
會導致指向已經刪除元素的迭代器,具有無效值,因爲它指向了已經不存在的元素。
該問題類似於,懸垂指針(指向曾經存在的對象,但對象現在已經不存在了,這類指針)


容器定義的類型別名(所有容器都支持)
size_type 無符號整型,足以存儲此容器的最大可能容器長度
iterator 此類容器的迭代器
const_iterator 元素的只讀迭代器
reverse_iterator 按逆序尋址元素的迭代器
const_reverse_iterator 元素的只讀逆序迭代器
difference_type 足夠存儲2個迭代器差值的有符號整型,可爲負數
value_type 元素類型
reference 元素的左值類型,是value_type& 的同義詞
const_reference 元素的常量左值類型,等效於 const value_type&










vector<int> vec(10);
// 以下2種操作
// 容器不是const,則返回類型:vector<int>::iterator 
// 容器是const,	 則返回類型:vector<int>::const_iterator 
vec.begin();
vec.end();

// 以下2種操作
// 容器不是const,則返回類型:vector<int>::reverse_iterator 
// 容器是const,	 則返回類型:vector<int>::const_reverse_iterator 
vec.rbegin();
vec.rend();


在順序容器中添加元素的操作
c.push_back(t) 在容器c 的尾部添加值爲t 的元素。返回 void 類型
c.push_front(t) 在容器c 的前端添加值爲t 的元素。返回 void 類型
只適用於 list 和 deque 容器類型
c.insert(p, t) 在迭代器p 所指向的元素前面插入值爲 t 的新元素。
返回指向新添加元素的迭代器
c.insert(p, n, t) 在迭代器p 所指向的元素前面插入 n 個值爲 t 的新元素。
返回 void 類型
c.insert(p, b, e) 在迭代器p 所指向的元素前面插入由迭代器 b 和 e 標記的範圍內的元素。
返回 void 類型









容器元素都是副本

vector<string> svec;
list<string> slist;
string spouse("This is my word");

// 等價於: slist.push_front(spouse);
slist.insert(slist.begin(), spouse);

// vector 不支持 push_front();
// 但是,可以使用 insert() 達到相同的效果。
// 只是,vector 使用 insert 時,除非在末尾插入,否則程序開銷比較大
svec.insert(svec.begin(), spouse);



svec.insert(svec.end(), 10, "Spaceholder");

string sarray[3] = {"google", "baidu", "qq"};
slist.insert(slist.end(), sarray, sarray+3);



vector<int> ivec(10);
vector<int>::iterator first = ivec.begin();
// vector<int>::iterator first = ivec.begin(), last = ivec.end();
// while(first != last)
// 不按照以上寫法,是因爲,insert() 執行之後,last迭代器已經失效。
// 因此要避免存儲 end 操作返回的迭代器
while(first != ivec.end())
{
	first = ivec.insert(++first, 42);
	++first;
}


容器的關係運算

vector<int> ivec1, ivec2, ivec3, ivec4, ivec5;
/*
	ivec1: 1 3 5 7 9 12
	ivec2: 0 2 4 6 8 10 12
	ivec3: 1 3 9
	ivec4: 1 3 5 7
	ivec5: 1 3 5 7 9 12
*/
ivec1 > ivec2;	// true
ivec3 > ivec1;	// true
ivec1 > ivec4;	// true
ivec1 == ivec5;	// true


順序容器的大小操作
c.size() 返回容器c 中的元素個數。返回類型:c::size_type
c.max_size() 返回容器c 可容納的最多元素個數
返回類型:c::size_type
c.empty() 返回標記容器大小是否爲0 的布爾值
c.resize(n) 調整容器 c 的長度大小,使其能容納 n 個元素
如果 n<c.size() ,則刪除多出來的元素,否則,添加新元素,值初始化
c.resize(n, t) 調整容器 c 的大小,使其能容納 n 個元素。新添加元素時,用 t 來初始化






resize() 操作,也會使迭代器失效。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章