1)逻辑模型:一一对应,键(信息索引)值(信息内容)对,用于信息检索,检索性能可以对数级(O(logN))。
2)物理模型:平衡有序二叉树,又名红黑树。
5 4 3 2 1
3
2 4
1 5
3)键必须是唯一的。
4)迭代过程实际上是关于键的中序遍历(L-D-R),键升序。
5)存储单位是由键和值组成的pair。
template<typename FIRST, typename SECOND>
class pair {
public:
pair (FIRST const& f, SECOND const& s) : first (f), second (s) {}
FIRST first; // 键
SECOND second; // 值
};
映射的迭代器相当于是指向pair对象的指针。
6)映射中键都是只读的。
7)构建和修改性能较差。适用于结构稳定但是频繁检索的场合。
8)支持"下标"运算,用键做下标,得到对应的值的引用。如果所给出键不存在,会增加一个节点,返回其值,如果键存在,直接返回对应的值。
注意:只有map支持下标运算,multimap不支持下标运算
当取一个不存在的key值的value时:如果value为内置类型,其值将被初始化为0;如果value为自定义数据结构且用户定义了默认值则初始化为默认值,否则初始化为0。
例如:
map<int,int> emptyMap{}; int i = emptyMap[100]; // i = 0
emptyMap[101]++;//可以直接这样使用
#include <iostream> #include <map> #include <string> using namespace std; class Candidate { public: Candidate(string const& name = "") : m_name(name), m_votes(0) {} string const& name(void) const { return m_name; } int votes(void) const { return m_votes; } void vote(void) { ++m_votes; } private: string m_name; int m_votes; }; int main(void) { map<char, Candidate> mcc; mcc.insert(pair<char, Candidate>( 'A', Candidate("张飞"))); mcc.insert(make_pair( 'B', Candidate("赵云"))); mcc['C'] = Candidate("关羽"); mcc['D'] = Candidate("马超"); mcc['E'] = Candidate("黄忠"); typedef map<char, Candidate>:: iterator IT; /* pair<IT, bool> res = mcc.insert ( make_pair ('B', Candidate ("杨健"))); if (! res.second) cout << "插入失败!" << endl; */ mcc['B'] = Candidate("杨健"); IT it = mcc.begin(); // it->first = 'X'; it->second = Candidate("杨健"); for (int i = 0; i < 10; ++i) { for (IT it = mcc.begin(); it != mcc.end(); ++it) cout << '(' << it->first << ')' << it->second.name() << ' '; cout << endl << "请投下宝贵的一票:" << flush; char key; cin >> key; IT it = mcc.find(key); if (it == mcc.end()) { cout << "废票!" << endl; continue; } it->second.vote(); } IT win = mcc.begin(); for (IT it = mcc.begin(); it != mcc.end(); ++it) { cout << it->second.name() << "获得" << it->second.votes() << "票。" << endl; if (it->second.votes() > win->second.votes()) win = it; } cout << "热烈祝贺" << win->second.name() << "成功当选首席保洁员!" << endl; return 0; }