轉載自http://www.cnblogs.com/crazyant/archive/2011/06/04/2072852.html
這篇文章總結了順序容器的各種常見操作函數。因爲是是第四版,所以和最新的c++標準還是有些不同,但大部分的還是使用的。
C++ Primer 4th 第九章 順序容器
表9-1 順序容器類型 |
|
順序容器 |
|
vector |
支持快速隨機訪問 |
list |
支持快速插入/刪除 |
deque |
雙端隊列 |
順序容器適配器 |
|
stack |
後進先出 (LIFO) 棧 |
queue |
先進先出 (FIFO) 隊列 |
priority_queue |
有優先級管理的隊列 |
表9-2 容器構造函數 |
|
C<T> c; |
創建一個名爲c的空容器。C是容器類型名,如vector,T是元素類型,如int或string。 適用於所有容器 |
C c(c2); |
創建容器c2的副本c;c和c2必須具有相同的容器類型,並存放相同的元素。適用於所有容器 |
C c(b, e); |
創建c,其元素是迭代器b和e標示的範圍內元素的副本。適用於所有容器 |
C c(n, t); |
用n個值爲t的元素創建容器c,其中值t必須是容器類型C的元素類型的值,或者是可轉換爲該類型的值 只適用於順序容器 |
C c(n); |
穿件有n個值初始化 (value-initialized) 元素的容器c 只適用於順序容器 |
表9-3 常用迭代器運算 |
|
*iter |
返回迭代器iter所指向的元素的引用 |
iter->mem |
對iter進行解引用,獲取指定元素中名爲mem的成員。等效於(*iter).mem |
++iter |
給iter加1,使其指向容器裏的下一個元素 |
iter++ |
|
--iter |
給iter減1,使其指向容器裏的前一個元素 |
iter-- |
|
iter1 == iter2 |
比較兩個迭代器是否相等(不等)。當兩個迭代器指向同一容器中的同一個元素,或者當它們都指向同一個容器的超出末端的下一位置時,兩個迭代器相等 |
iter1 != iter2 |
表9-4 vector和deque類型迭代器支持的操作 |
|
iter + n |
在迭代器上加(減)整數值n, 將產生指向容器中前面(後面)第n個元素的迭代器。新計算出來的迭代器必須指向容器中的元素或超出容器末端的下一元素 |
iter – n |
|
iter1 += iter2 |
這是迭代器加減法的符合賦值運算:將iter1加上或減去iter2的運算結果賦給iter1 |
iter1 -= iter2 |
|
iter1 – iter2 |
兩個迭代器的減法,其運算結果加上左邊的迭代器即得左邊的迭代器。這兩個迭代器必須指向同一個容器中的元素或超出元素末端的下一位置 只適用於vector和deque容器 |
>, >=, <, <= |
迭代器的關係操作符。當一個迭代器指向的元素在容器中位於另一個迭代器指向的元素之前,則前一個迭代器小於後一個迭代器。關係操作符的兩個迭代器必須指向同一個容器中的元素或超出容器末端的下一位置 只適用於vector和deque容器 |
表9-5 容器定義的類型別名 |
|
size_type |
無符號整型,足以存儲此容器類型的最大可能容器長度 |
iterator |
此容器類型的迭代器類型 |
const_iterator |
元素的只讀迭代器類型 |
reverse_iterator |
按逆序尋址元素的迭代器 |
const_reverse_iterator |
元素的只讀(不能寫)逆序迭代器 |
difference_type |
足夠存儲兩個迭代器差值的有符號整型,可爲負數 |
value_type |
元素類型 |
reference |
元素的左值類型,是value_type&的同義詞 |
const_reference |
元素的常量左值類型,等效於const value_type& |
表9-6 容器的begin和end操作 |
|
c.begin() |
返回一個迭代器,它指向容器c的第一個元素 |
c.end() |
返回一個迭代器,它指向容器c的最後一個元素的下一個位置 |
c.rbegin() |
返回一個逆序迭代器,它指向容器c的最後一個元素 |
c.rend() |
返回一個逆序迭代器,它指向容器c的第一個元素前面的位置 |
表9-7 在順序容器中添加元素的操作 |
|
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類型 |
表9-8 順序容器的大小操作 |
|
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 |
表9-9 訪問順序容器內元素的操作 |
|
c.back() |
返回容器c的最後一個元素的引用。如果c爲空,則該操作未定義 |
c.front() |
返回容器c的第一個元素的引用。如果c爲空,則該操作未定義 |
c[n] |
返回下標爲n的元素的引用 如果n<0或n>=c.size(),則該操作未定義 只適用於vector和deque容器 |
c.at(n) |
返回下表爲n的元素的引用。如果下標越界,則該操作未定義 只適用於vector和deque容器 |
表9-10 刪除順序容器內元素的操作 |
|
c.erase(p) |
刪除迭代器p所指向的元素 返回一個迭代器,它指向被刪除元素後面的元素。如果p指向容器內的最後一個元素,則返回的迭代器指向容器的超出末端的下一位置。如果p本身就是指向超出末端的下一位置的迭代器,則該函數未定義 |
c.erase(b, e) |
刪除迭代器b和e所標記的範圍內的所有元素 返回一個迭代器,它指向被刪除元素段後面的元素。如果e本身就是指向超出末端的下一位置的迭代器,則返回的迭代器也指向容器的超出末端的下一位置 |
c.clear() |
刪除容器c內的所有元素。返回void |
c.pop_back() |
刪除容器c的最後一個元素。返回void。如果c爲空容器,則該函數未定義 |
c.pop_front() |
刪除容器c的第一個元素。返回void。如果c爲空容器,則該函數未定義。只適用於list和deque容器 |
表9-11 順序容器的賦值操作 |
|
c1 = c2 |
刪除容器c1的所有元素,然後將c2的元素複製給c1。c1和c2的類型(包括容器類型和元素類型)必須相同 |
c1.swap(c2) |
交換內容:調用完該函數後,c1中存放的是c2原來的元素,c2中存放的則是c1原來的元素。c1和c2的類型必須相同。該函數的執行速度通常要比將c2的元素複製到c1的操作快 |
c.assign(b, e) |
重新設置c的元素:將迭代器b和e標記的範圍內所有的元素複製到c中。b和e必須不是指向c中元素的迭代器 |
c.assign(n, t) |
將容器c重新設置爲存儲n個值爲t的元素 |
表9-12 普通的string操作 |
|
string s; |
定義一個新的空string對象,命名爲s |
string s(cp); |
定義一個新的string對象,用cp所指向的(以空字符null結束的)C風格字符串初始化該對象 |
string s(s2); |
定義一個新的string對象,並將它初始化爲s2的副本 |
is>>s; |
從輸入流is中讀取一個以空白字符分割的字符串,寫入s |
os<<s; |
將s寫到輸出流os中 |
getline(is, s) |
從輸入流is中讀取一行字符,寫入s |
s1 + s2 |
把s1和s2串接起來, 產生一個新的string對象 |
s1 += s2 |
將s2拼接在s1的後面 |
關係操作符 |
相等運算(==和!=)以及關係運算(<、<=、>和>=)都可用於string對象的比較,等效於(區分大小寫的)字典次序的比較 |
表9-13 構造string對象的其他方法 |
|
string s(cp, n) |
創建一個string對象,它被初始化爲cp所指向數組的前n個元素的副本 |
string s(s2, pos2) |
創建一個string對象,它被初始化爲一個已存在的string對象s2中從下表pos2開始的字符的副本 如果pos2 > s2.size(),則該操作未定義 |
string s(s2, pos2, len2) |
創建一個string對象,它被初始化爲s2中從下標pos2開始的len2個字符的副本。如果pos2 > s2.size(),則該操作未定義 無論len2的值是多少,最多隻能複製s2.sizeZ() – pos2個字符 注意:n、len2和pos2都是unsigned值 |
表9-14 與容器共有的string操作 |
|
s.insert(p, t) |
在迭代器p指向的元素之前插入一個值爲t的新元素。返回指向新插入元素的迭代器 |
s.insert(p, n, t) |
在迭代器p指向的元素之前插入n個值爲t的新元素。返回void |
s.insert(p, b, e) |
在迭代器p指向的元素之前插入迭代器b和e標記範圍內所有的元素。返回void |
s.assign(b, e) |
用迭代器b和e標記範圍內的元素替換s。對於string類型,該操作返回s;對於容器類型,則返回void |
s.assign(n, t) |
用值爲t的n個副本替換s。對於string類型,該操作返回s;對於容器類型,則返回void |
s.erase(p) |
刪除迭代器p指向的元素。返回一個迭代器,指向被刪除元素後面的元素 |
s.erase(b, e) |
刪除迭代器b和e標記範圍內的所有元素。返回一個迭代器,指向被刪除元素段後面的第一個元素 |
表9-15 string類型特有的版本 |
|
s.insert(pos, n, c) |
在下標爲pos的元素之前插入n個字符c |
s.insert(pos, s2) |
在下標爲pos的元素之前插入string對象s2的副本 |
s.insert(pos, s2, pos2, len) |
在下標爲pos的元素之前插入s2中從下標pos2開始的len個字符 |
s.insert(pos, cp, len) |
在下標爲pos的元素之前插入cp所指向數組的前len個字符 |
s.insert(pos, cp) |
在下標爲pos的元素之前插入cp所指向的以空字符結束的字符串副本 |
s.assign(s2) |
用s2的副本替換s |
s.assign(s2, pos2, len) |
用s2中從下標pos2開始的len個字符副本替換s |
s.assign(cp, len) |
用cp所指向數組的前len個字符副本替換s |
s.assign(cp) |
用cp所指向的以空字符結束的字符串副本替換s |
s.erase(pos, len) |
刪除從下標pos開始的len個字符 |
除非特殊聲明,上述所有操作都返回s的引用 |
表9-16 字串操作 |
|
s.substr(pos, n) |
返回一個string類型的字符串,它包含s中從下標pos開始的n個字符 |
s.substr(pos) |
返回一個string類型的字符串,它包含從下標pos開始到s末尾的所有字符 |
s.substr() |
返回s的副本 |
表9-17 修改string對象的操作(args在表9-18中定義) |
|
s.append(args) |
將args串接在s後面。返回s的引用 |
s.replace(pos, len, args) |
刪除s中從下標pos開始的len個字符,用args指定的字符代替之。返回s的應用 在這個版本中,args不能爲b2, e2 |
s.replace(b, e, args) |
刪除迭代器b和e標記的範圍內所有的字符,用args替換之。返回s的引用 在這個版本中,args不能爲s2, pos2, len2 |
表9-18 append和replace操作的參數:args |
|
s2 |
string類型的字符串s2 |
s2, pos2, len2 |
字符串s2中從下標pos2開始的len2個字符 |
cp |
指針cp指向的以空字符結束的數組 |
cp, len2 |
cp指向的以空字符結束的數組中前len2個字符 |
n, c |
字符c的n個副本 |
b2, e2 |
迭代器b2和e2標記的範圍內所有字符 |
表9-19 string類型的查找操作(其參數args在表9-20中定義) |
|
s.find(args) |
在s中查找args的第一次出現 |
s.rfind(args) |
在s中查找args的最後一次出現 |
s.find_first_of(args) |
在s中查找args的任意字符的第一次出現 |
s.find_last_of(args) |
在s中查找args的任意字符的最後一次出現 |
s.find_first_not_of(args) |
在s中查找第一個不屬於args的字符 |
s.find_last_not_of(args) |
在s中查找最後一個不屬於args的字符 |
表9-20 string類型提供的find操作的參數 |
|
c, pos |
在s中,從下標pos標記的位置開始,查找字符c。pos的默認值爲0 |
s2, pos |
在s中,從下標pos標記的位置開始,查找string對象s2。pos的默認值爲0 |
cp, pos |
在s中,從下標pos標記的位置開始,查找指針cp所指向的C風格的以空字符結束的字符串。pos的默認值爲0 |
cp, pos, n |
在s中,從下標pos標記的位置開始,查找指針cp所指向數組的前n個字符。pos和n都沒有默認值 |
表9-21 string類型的compare操作 |
|
s.compare(s2) |
比較s和s2 |
s.compare(pos1, n1, s2) |
讓s中從pos下標位置開始的n1個字符與s2作比較 |
s.compare(pos1, n1, s2, pos2, n2) |
讓s中從pos1下標位置開始的n1個字符與s2中從pos2下標位置開始的n2個字符作比較 |
s.compare(cp) |
比較s和cp所指向的以空字符結束的字符串 |
s.compare(pos1, n1, cp) |
讓s中從pos1下標位置開始的n1個字符與cp所指向的字符串作比較 |
s.compare(pos1, n1, cp, n2) |
讓s中從pos1下標位置開始的n1個字符與cp所指向字符串的前n2個字符作比較 |
表9-22 適配器通用的操作和類型 |
|
size_type |
一種類型,足以存儲此適配器類型最大對象的長度 |
value_type |
元素類型 |
container_type |
基礎容器的類型,適配器在此容器類型上實現 |
A a; |
創建一個新的空適配器,命名爲a |
A a(c); |
創建一個名爲a的新適配器,初始化爲容器c的副本 |
關係操作符 |
所有適配器都支持全部關係操作符:==、!=、<、<=、>、>= |
表9-23 棧容器適配器支持的操作 |
|
s.empty() |
如果棧爲空,則返回true,否則返回false |
s.size() |
返回棧中元素的個數 |
s.pop() |
刪除棧頂元素,但不返回其值 |
s.top() |
返回棧頂元素的值,但不刪除該元素 |
s.push(item) |
在棧頂壓入新元素 |
表9-24 隊列和優先級隊列支持的操作 |
|
q.empty() |
如果隊列爲空,則返回true,否則返回false |
q.size() |
返回隊列中元素的個數 |
q.pop() |
刪除隊首元素,但不返回其值 |
q.front() |
返回隊首元素的值,但不刪除該元素 該操作只適用於隊列 |
q.back() |
返回隊尾元素的值,但不刪除該元素 該操作只適用於隊列 |
q.top() |
返回具有最高優先級的元素值,但不刪除該元素 該操作只適用於優先級隊列 |
q.push(item) |
對於queue,在隊尾壓入一個新元素 對於priority_queue,在基於優先級的適當位置插入新元素 |