C++_顺序容器
順序容器類型
順序容器
- vector: 支持快速隨機訪問
- list: 支持快速插入與刪除
- deque: 雙端隊列
順序適配器
- stack: 后進先出(LIFO)堆棧
- queue: 先進先出(FIFO)隊列
- priority_queue: 有優先級管理的隊列
上述順序容器包含于以下頭文件中:< vector >,< list >,< deque >;
所有的容器類型都定義了默認的構造函數,用于創建指定的空容器類型, 默認構造函數不帶參數
容器構造函數
//C為容器名, T元素類型(T也可以是容器類型), c容器
C c(n); 創建n個值初始化元素的容器,只適用于順序容器
注: 將一個容器復制給另一個容器的時候, 容器類型,元素類型必須匹配;
容器內元素類型必須支持賦值運算, 元素對象必須可以復制(IO流對象就不可以作為元素類型,不支持復制或賦值)
例:
迭代器
所有迭代器都具有相同接口, 迭代器可看做指針;
迭代器常用運算
- *iter : 返回迭代器iter所指向元素的引用
- ++iter/iter++/iter–/–iter : 給iter加1或減1,使其指向容器中前一個元素與后一個元素
- iter==/!= : 比較兩個迭代器是否相等, 兩個迭代器指向容器中同一個元素時,迭代器相等
vector與deque容器中提供額外運算, 可進行+/-n的算術運算,以及比較大小, 等同于數組中元素地址的運算
注: 在迭代器范圍中遵守: [begin, end) ,end表示最后一個元素的后一個位置, 當begin等于end的時候則容器為空; 在元素的添加或刪除的時候, 應該相應調整迭代器的值,避免產生無效的迭代器
容器定義的類型
- size_type: 無符號整數,表示容器的最大存儲長度
- iterator: 容器迭代器類型
- const_iterator: 只讀迭代器,類似于 const TYPE* iter
- reverse_iterator: 按逆序查找元素
difference_type: 存儲兩個迭代器的差值(包含負數)
在順序容器中添加元素
c.push_back(t): 尾部插入t, 返回void
- c.push_front(t): 前端插入t, 返回void, 只適用于list ,deque (其主要原因在于list,deque可基于鏈表實現,而vector為數組,其擴容方式與鏈表不同)
- c.insert(p,t): 在迭代器p所指向的元素前面插入元素為t的新元素, 返回添加新元素的迭代器
- c.insert(p,n,t): 在迭代器p所指向的元素前面插入n個值為t的新元素, 返回void
- c.insert(p,b,e): 在迭代器p所指向元素的前面插入由迭代器b和e標記的范圍元素, 返回void
注:push_back與push_fron 也可寫成: c.insert(c.end(), t)與c.insert(c.begin(),t) ,vector不可push_front;
在插入元素后應注意迭代器的更新, 當新元素插入后迭代器都將出現失效, 在循環使用insert的時候應注意迭代器的更新
例:
容器之間的比較
容器之間的比較必須二者具有相同容器類型和元素類型;
容器之間的比較是基于元素類型的比較運算,若當前元素類型不支持大小比較, 那容器就不能進行比較操作
所有容器都通過比較其元素對來實現關系運算
容器大小容量操作
- c.size() : 返回容器c中元素個數,返回類型為c::size_type
- c.max_size(): 返回容器的最大容納量,返回c::size_type
- c.empty(): 返回標記容器大小是否為0的bool值
- c.resize(n): 重新調整容器大小,使其能容納n個元素,超出范圍時,刪除多余元素(屬于壓縮容器)
- c.resize(n,t): 重新調整容器大小,使其能容納n個元素,所添加的新元素的值都為t
注: resize操作將導致迭代器失效
訪問順序容器元素
- c.back(): 返回c最后一個元素的引用,c為空時, 該操作未定義
- c.front(): 返回第一個元素的引用,c為空, 則操作未定義
- c[n] : 返回下標為n的元素的引用, n<0||n>c.size(), 則操作未定義,只適用于vector與deque
- c.at(n):與c[n]一致
順序容器元素刪除
- c.erase(p): 刪除迭代器p所指向的元素,返回一個迭代器, 指向被刪除元素的后一位置, p若超出末端則操作未定義
- c.erase(b,e): 刪除迭代器b,e標記的范圍內所有元素, 返回一個迭代器,指向被刪除元素的后一位置,超出末端的時候返回超出末端的下一位置
- c.clear(): 刪除所有元素,返回void
- c.pop_back(): 刪除容器c的最后一個元素,返回void,c為空時則操作未定義
- c.pop_front():刪除c的第一個元素,返回void,只適用于list或deque
注:采用pop_front與front結合使用,可實現棧結構
list<int>ll; while(!ll.empty()){cout<<ll.front();ll.pop_front(); }當使用erase刪除時,必須保證迭代器位置正確
刪除操作也會導致迭代器失效
容器的選擇
總結
- 上一篇: 函数与lambda
- 下一篇: s3c2440移植MQTT