標籤:
所謂容器,就是一個裝東西的盒子,在c++中,我們把裝的東西叫做“元素”
而順序容器,就是說這些東西是有順序的,你裝進去是什麼順序,它們在裡面就是什麼順序。
c++中的順序容器一共有這麼幾種:
| vector |
可變大小數組 |
| deque |
雙端隊列 |
| list |
雙向鏈表 |
| forward_list |
單向鏈表 |
| array |
固定數組大小 |
| string |
與vector相似的容器,但專門用於儲存字元 |
這些容器可以讓我們方便地放元素,取元素,but,她們在:添加、刪除、非順序訪問,這些方面的效能都是不同滴(根據需要適當選擇)
列了一大堆,就是為了有個印象,不知道她們是幹啥的,後面慢慢學...
先不要逐個的去學,我們先來看一下共性的東西,下面是所有容器類型都提供的操作
| 類型別名 |
|
| iterator |
迭代器 |
| const_iterator |
唯讀迭代器 |
| size_type |
unsigned int,保證可以存下此種容器的最大可能長度 |
| difference_type |
int, 足夠儲存兩個迭代器之間的距離,是有符號的 |
| value_type |
元素類型 |
| reference |
元素的左實值型別,即value_type& |
| const_reference |
即const value_type & |
| 建構函式 |
|
| C c |
預設建構函式,構造空容器 |
| C c1(c2) |
構造了c1,內容是拷貝c2的 |
| C c(b, e) |
構造c,將迭代器b和e指定的範圍內的元素拷貝到c |
| C c{a, b, c...} |
列表初始化c |
| 賦值與swap |
|
| c1 = c2 |
將c1中的元素替換為c2中的元素 |
| c1 = {a,b,c...} |
將c1中的元素替換為列表中的元素(array不適用) |
| a.swap(b) |
交換a,b的元素 |
| 大小 |
|
| c.size() |
c中元素的數目(forward_list不適用) |
| c.max_size() |
c可儲存的最大元素數目 |
| c.empty() |
c是否為空白,空true,不空false |
| 添加/刪除元素 |
|
| c.insert(args) |
將args中的元素拷貝進c |
| c.emplace(inits) |
使用inits構造c中的一個元素 |
| c.erase(args) |
刪除args指定的元素 |
| c.clear() |
刪除c中的所有元素,返回void |
| 關係運算子 |
|
| ==, != |
是否相等,是否不等 |
| <, <=, >. >= |
關係運算子 |
| 擷取迭代器 |
|
| c.begin(), c.end() |
擷取首元素,尾元素之後位置,的迭代器 |
| c.cbegin(), c.cend() |
返回const_iterator |
| 反向容器的額外成員 |
|
| reverse_iterator |
反著定址的迭代器 |
| const_reverse_interator |
唯讀逆序迭代器 |
| c.rbegin(), c.rend() |
尾元素,首元素之前的迭代器 |
| c.crbegin(), c.crend() |
返回const_reverse_iterator |
好多...我都敲暈乎了
先有蛋才有雞,首先我們來看“建構函式",一共分這麼幾種:
(1) 預設初始化; (2) 拷貝初始化; (3) 列表初始化; (4) 迭代器初始化; (5) 順序容器特有初始化
用vector做個栗子,代碼如下:
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 int main() 7 { 8 vector<int> vec1; //預設初始化 9 vector<int> vec2{1,2,3,4}; //列表初始化10 vector<int> vec3{5,6,7,8};11 vec3 = vec2;12 vector<int> vec4(vec3); //拷貝初始化13 vector<int> vec5(vec4.begin()+1, vec4.end()-1); //迭代器初始化14 vector<int> vec6(10,2); //順序容器特有初始化15 return 0;16 }seq_container_definition
執行結果gdb看一下:
好,然後我們來看一下迭代器,以及begin()和end()
迭代器和指標差不多,反正就是讓我們來遍曆著訪問元素的,begin()取到第一個元素,end()取到?尾元素的後一個位置(one past the last element)
下面貼個snippet來看她的使用:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 int main() 7 { 8 string s("time for lunch"); 9 string::iterator iter = s.begin();10 while(iter != s.end()){11 *iter = toupper(*iter);12 iter++;13 } 14 cout << s << endl;15 return 0;16 }seq_container_iterator
注意一點就是:如果你往容器物件裡添加或者刪除了元素,也即改變了對象容量,那麼對象上原有的迭代器就會失效
c++ 順序容器學習