1.順序容器(sequence container) --擁有由單一類型元素組成的一個有序集合
list, vector, deque
2.關聯容器(associative container) --支持查詢一個元素是否存在, 并且可以有效地獲取元素
map, set, multimap, multiset
3.容器的容量 --在容器下一次需要增長自己之前能夠被加入到容器中的元素的總數(容量只與連續存儲的容器相關:vector, deque, string. 而list不要求
容量)
4.capacity()操作 --求一個容器的容量
5.容器的長度 --容器當前擁有元素的個數
6.size()操作 --求一個容器的長度
7.數據類型越復雜, vector的效率就越低
8.reserve()操作 --允許程序員將容器的容量設置成一個現實指定的值
9.迭代器(iterator) --提供了一種一般化的方法, 對順序或關聯容器類型中的每個元素進行連續訪問
10.每個容器類型都提供了一個begin()和一個end()成員函數
11.begin()返回一個iterator, 指向容器的第一個元素
12.end()返回一個iterator, 指向容器的末元素的下一個位置
13.出了iterator類型, 每個容器還定義了一個const iterator類型, 對于遍歷const容器是必需的
14.iterator算術論算只適用于vector或deque, 而不適用與list, 因為ielist的元素在內存中不是連續存儲的
15.string.find_first_of()查找與被搜索字符串中任意一個字符相匹配的第一次出現, 并返回它的索引位置
16.string.substr()生成string對象的字串的一個拷貝
17.string.rfind()查找最后的指定字串出現的索引
18.string.find_first_not_of()查找第一個不與要搜索字符串的任意字符相匹配的字符
19.string.find_last_of()查找字符串中的"與搜索字符串任意元素相匹配"的最后一個字符
20.string.find_last_not_of()查找字符串中的"與搜索字符串任意字符全不匹配"的最后一個字符
21.string.erase(pos, num)操作去掉字符串中的指定串, pos表示位置, num表示去掉的長度
22.<locale>ctype類, 封轉了標準c庫函數的功能及一組非成員函數
23.string.compare(pos, num, str); 比較pos位置的后面num個字符是否為str
24.string.insert(pos, newstring); pos表示要插入的位置, newstring表示要插入的字符串
25.string.assign(); 字符串拷貝
26.string.append(); 字符串拼接
27.string.swap(); 交換兩個字符串
28.string.at(); 對字符的下標索引操作, 有對索引值范圍檢測, 下標越界時拋出out_of_range異常
try {
char ch = st.at(index);
} catch(std::out_of_range) { ... }
29.string.replace(pos, num, newstring); 用newstring代替pos后面num個字符子串
30.map 也叫關聯數組(associative array) 鍵/值對 key/value
鍵用來索引map, 值用作存儲和檢索的數據
map對象定義, 至少要指明鍵和值的類型, 如:
map<string, int> word_count;
31.map的數據錄入
map<string, string> str_str;
str_str[string("one")] = string("1"); //這種效率比較低
str_str.insert(
map<string, string>::value_type("two", "2")
); //這種效率高
32.查找并獲取map中的元素
最簡單的方法:
value = mapObj[key];
但這樣有個問題, 如果不存在key這個鍵, mapObj就會插入key鍵, 并把對應的value值為默認值, 這樣得到的value是無效的
所以, 應該這樣寫
if(mapObj.count(key))
value = mapObj[key];
或者這樣:
map<keyType, valueType>::iterator iter = mapObj.find(key);
if(iter != mapObj.end())
value = mapObj[key];
33.從map中刪除元素
erase操作
mapObj.erase(key);
還有兩種重載方式, 詳見文檔
mapObj.clear(); 清空map對象所有值
34.set對象插入元素
#include <set>
set<setType> setObj;
setObj.insert(key);
35.set對象查找元素
setObj.count(key); //1有, 0沒有
setObj.find(key); iter為setObj.end()表示沒有
36.multiset和multimap允許要被存儲的鍵出現多次
對于multiset和multimap的迭代策略是聯合使用find返回的iterator和count返回的值:
count = mulsetObj.count();
multiset<type>::iterator iter;
iter = mulsetObj.find(key);
for(int i = 0; i < count; ++i, ++iter)
do_something(*iter);
另一種方法是使用equal_range()返回的iterator值
如果這個值存在, 則第一個iterator指向該值的第一個實例, 且第二個iterator指向這個值的最后一個實例的下一個位置:
switch(mulmapObj.count) {
case 0: break; //不存在
case 1: //只有一項, 用普通的find操作
multimap<keyType, valueType>::iterator iter;
iter = mulmapObj.find(key);
do_something(*iter);
break;
default: //有許多項
typedef multimap<keyType, valueType>::iterator it;
pair<it, it>pos;
pos = mulmapObj.equal_range(key);
for(; pos.first != pos.second; pos.first++)
do_somethine(*pos.first);
}
//對應的, 刪除的話用mulmapObj.erase(pos.first, pos.second);
//不支持下標操作是訪問multimap元素的一個限制:
mulmapObj[key]; //錯誤
37.棧容器(stack container)支持的操作 //頭文件<stack>
empty()
size()
pop()
top()
push(item)
38.棧類型被稱為容器適配器(container adapter)
39.缺省情況下, 棧用容器類型deque實現, 改變這個缺省值可以這樣:
stack<type, list<type>> stackObj; //改成用容器類型list實現
//一般是定義一個指針棧
class CTest;
stack<CTest*> ctestStack;
40.標準庫提供了兩種風格的隊列: queue(隊列), priority_queue(優先級隊列)
頭文件 <queue>
41.queue和priority_queue操作
empty()
size()
pos()
front() //只能用在一般隊列
back() //只能用在一般隊列
top() //只能用在優先級隊列
push(item)