順序容器包括:string, vector,deque,list,forward_list, array.每個容器除了支持公共的操作接口,還有自己的操作。比如單向鏈表的迭代器不能自減運算.
string : 保存字符或字符串,隨機訪問,尾部插入或刪除.
vector:可變大小數組,隨機訪問,尾部插入或刪除.
array:固定大小數組,隨機訪問,不能添加或刪除元素.
deque: 雙端隊列,隨機訪問,頭尾插入或刪除元素快.
list:雙向鏈表,雙向順序訪問,任何位置可以插入和刪除.
forward_list: 單向鏈表,單向順序訪問,任何位置插入和刪除.
1. 容器的定義和初始化
方法:
C c 默認構造函數
C c1(c2) 將一個容器初始化爲另一個容器的拷貝
C c={a,v,b,...} 列表初始化
C c(b,e) 利用迭代器的範圍,將迭代器範圍的元素賦給
只有順序容器的構造函數還可以接受容器大小和一個元素初始值的參數
C c(n,value)/c(n)
對於array:定義一個array時需要指定數據類型,還要指定容器大小。如果元素爲類類型,那麼類必須有默認構造函數。
array<數據類型,容器大小> 對象名;
PS:不能對內置數組類型進行拷貝或對象賦值操作,因爲內置數組和array是不同的。
2.賦值
方式:拷貝,列表賦值,swap,assign
拷貝:c1=c2;
列表賦值: c1={a,d,....};
assign:
v.assign(b,e):倆個迭代器之間的元素
v.assign(lt):lt爲值列表
v.assign(n,t):用n個t來給容器V賦值
swap:
v1.swap(v2):交換容器 v1,v2的數據
swap(v1,v2):
對於array:不能使用assign,以及不允許值列表對其賦值,但是可以列表初始化。
使用assign僅順序容器能用,不適合array和關聯容器。
2.添加元素:
array不能添加和刪除元素
push_back(emplace_back): vector,string,deque,list
push_front(emplace_front): deque,list, forward_list
empalce(iterator,value)
empalce(iterator,args) 返回指向插入的第一個元素的迭代器
insert(iterator,value)
insert(iterator,n,value)
insert(iterator,b,e)
insert(iterator,list) 返回新添加的第一個元素的迭代器,不成功返回iterator
3.刪除元素
pop_back : vector,string,deque,list
pop_front: deque,list,forward_list
erase(iterator)
erase(b,e)
clear()
4.訪問元素:
包括array在內的順序容器有front的成員函數,除了forward_list外都有 back 成員函數,通過調用他們可以獲得首尾元素的引用。(訪問元素前確保容器非空),使用下標不能越界。
下標和at只能用在可以隨機訪問的容器中:string,vector,deque,array.
5.改變容器大小
通過成員函數resize()可以調整容器元素的數量。
resize(n):如果n值大於當前的容器元素個數,那麼增加新元素到容器尾部。如果n值小於容器元素個數,那麼容器後面元素被刪除
resize(n,value): 增加的新元素到容器尾部,新元素值爲value
6.管理容器容量:
capacity():不重新分配內存的話,容器保存多少元素
shrink_to_fit():將capacity()減少爲size()相同大小,但是這只是個請求,標準庫不一定退還內存
reserve(n):分配能至少容納n個元素的內存,調用reserve不會減少內存,只會大於或等於當前容量。
shrink_to_fit():只適合string,vector,deque。
capacity()和reserve()只適合string,vector。
7.forward_list的特殊操作:
儘管forward_list有特殊版本的操作,但也支持前面的通用操作。
單向鏈表定義了首前迭代器:before_begin().
插入元素:
insert_after(iterator,value);在iterator指向的元素後插入元素值爲value的元素
insert_after(iterator,n,value);
insert_after(iterator,b,e);刪除迭代器b,e之間的元素
insert_after(iterator,list);插入值列表,返回指向插入最後一個元素的迭代器
emplace_after(p,value);
emplace_after(p,args);
刪除元素:
erase_after(iterator);刪除iterator指向元素的後一個位置的元素
erase_afer(b,e);刪除迭代器b,e之間的元素,返回指向被刪元素後的元素的迭代器
8.string的相關整理
<1>IO流對string的操作:
istringstream: 從string中讀數據
ostringstream:向string寫數據
<2>.構造string的其他方法:
string s(cp,s):string類型s是cp指向的數組前n個字符的拷貝。
string s(s2,pos): s是string的s2從下標pos開始的字符拷貝,如果pos>s2.size(),那麼構造函數未定義
string s(s2,pos,n): s是string s2從下標pos開始的n個字符的拷貝。
當我們利用字符數組構造string時候,必須使數組以空字符結尾,因爲拷貝操作遇到空字符爲止。否則造成構造函數未定義。
<3>.string其他操作
substr :返回string ,是原string的部分或全部字符的拷貝。傳遞給substr一個起始位置和計數值。
s.substr(pos,n):返回從pos位置開始後的n個字符
s.erase(pos,len) 刪除從pos(pos可以是位置或迭代器)指向的字符開始的n個字符。如果n忽略,則刪除從pos開始到末尾的所有字符。
s.insert(pos,args) 在pos之前插入args指定的字符
s.assign(args) 將s中字符全部換成args指定的字符
s.append(args) 將args指定的字符追加到s中
s.replace(range,args) 將range範圍內的字符替換成將args指定的字符、
args形式:
(str): 字符串str
(str,pos,len):str中pos開始最多len個字符
(cp) 指向以空字符結尾的數組
(cp,len) 字符數組前len個字符
(n,c) n個字符c
(b,e ) 迭代器B,E之間的字符
初始化列表: {.........}
range形式: (pos, len)或(b,e)
<4>.string的搜索
操作:
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出現字符的位置
args形式: str 字符串
c,pos 從s中位置pos開始查找字符c
s2,pos 從s中位置pos開始查找字符串s2
cp,pos 從pos開始查找以空字符結尾的字符串
cp,pos,n 從pos開始查找數組前n個字符
<5>.比較
compare 和C語言的 strcmp 類似
s.compare(s1) 比較s和s1
s.compare(pos1,n1,s2) 將s中從pos1開始的n1個字符與 s1比較
s.compare(pos1,n1,s2,pos2,n2) 將s中從pos1開始的n1個字符與 s1的pos2開始的n2個字符比較
s.compare(cp) s和cp指向的以空字符結尾的數組比較
s.compare(pos,n,cp) 將s中從pos開始的n個字符與 cp指向的以空字符結尾的數組比較
s.compare(pos,n,cp,n1) 將s中從pos開始的n個字符與 cp指向的以空字符結尾的數組前n1個字符比較
<6>.數組轉換
將數組轉換成字符,將數值字符轉換成數值
to_string(val) 將數值轉換成字符型,val可爲任何算術類型
stoi作用: string轉換成int
stoi(s,p.b) s:字符串 p:保存字符串內第一個非數組字符的下標,默認爲0 b:轉換用的基數,默認爲10
stod ,stof,atol 等都相似
PS:有些操作不進行過多的註釋,因爲本文的主要目的是將順序容器梳理下,以便以後複習之用!