對於有序容器(map、multimap、set、multiset),關鍵字型別必須定義元素比較的方法。預設使用運算子來比較。 在自定義運算子時,必須定義為嚴格弱序(strict weak ordering):即小於等於,性質如下:
兩個關鍵字不能同時小於等於對方。 如果k1小於等於k2,k2小於等於k3,那麼k1必須小於等於k3。 如果兩個關鍵字都不小於等於對方,那麼這兩個關鍵字等價。 設定比較型別時(multiset的第二個引數),應該是一種函式指標型別。
map的key是const的,set的key也是const的。 通常不對關聯容器使用泛型演算法,如果要,那就當作源序列(copy到乙個序列)或者當作乙個目的位置(呼叫inserter繫結插入器)。
std::map m; // 四種插入值的方法。
m.insert();
m.insert(make_pair("b", 22));
m.insert(pair("c", 333));
m.insert(map::value_type("d", 4444));
insert和emplace返回值是乙個pair,frist成員是迭代器(指向給定關鍵字的元素),second是bool,表明元素是否成功插入(已在容器的不插入,返回false)。
erase的返回值是刪除元素的數量,即對於可重複關鍵字容器,返回值可能大於1.
multimap和multiset中多個元素相同關鍵字時,這些元素會相鄰儲存。
// 獲取相同元素3種方法
multimap m,,, };
// 方法1:使用find和count
int count = m.count(1); // 查詢關鍵字是1的個數(3個)。
auto it = m.find(1); // 查詢第乙個關鍵字是1的迭代器。
for (size_t i = 0; i < count; ++i, ++it)
cout << it->second << endl; // 輸出所有相同關鍵字的值:a c d
// 方法2:使用lower_bound(返回第乙個不小於給定key的迭代器)和upper_bound(返回第乙個大於給定key的迭代器)
for (auto beg = m.lower_bound(1), end = m.upper_bound(1); beg != end; ++beg)
cout << beg->second << endl;
// 方法3:使用euqal_range,得到乙個pair,first等價lower_bound結果,second等價upper_bound結果。
無序容器在儲存上組織為一組桶,每個桶儲存0個或多個元素,使用乙個雜湊函式將元素對映到桶。相同雜湊值的元素會在同乙個桶中。 計算元素的雜湊值和在桶中搜尋通常都是很快的操作。 不能直接定義關鍵字型別是自定義型別的無序容器,因為要使用雜湊模版,所以必須同時提供自定義hash模版版本(需要提供函式代替==運算子(函式指標)和雜湊值計算函式(函式指標))。 <
C 關聯容器的使用例項
include include include include include include include using namespace std class textquery void read file ifstream is string text line line no const ...
關聯容器map用法例項
三種插入方式 2.1.1用insert方法插入 pair 物件 enummap.insert pair 1,one 2.1.2 用insert方法插入 value type 物件 enummap.insert map value type 1,one 2.1.3 用陣列方式插入值 enummap 1...
c 關聯容器
1.map建構函式 mapm 普通初始化 mapm m2 複製初始化法 mapm b,e 另乙個map物件的迭代器初始化法 注意 1 鍵值型別必須定義 操作符號,資料訪問時需要呼叫。2 m aaa 下表訪問方式導致的結果是,若鍵對應的值不存在,則插入該鍵值對應的預設值。2.map插入操作 m.ins...