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