順序容器:
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 容器的迭代器提供了額外的運算
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() 操作,也會使迭代器失效。