1、map 对象的定义
map<k, v> m; 创建一个名为m的空map对象,其键和值得类型分别为k和v
map<k, v> m(m1); 创建m1的副本m,m与m1必须有相同的键类型和值类型
map<k, v> m(b, e); 创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本。元素的类型必须能转换为pair<const k, v>
2、map类定义的类型
map<K, V>::key_type 在map容器中,用做索引的键的类型
map<K, V>::mapped_type 在map容器中,键所关联的值的类型
map<K, V>::value_type 一个pair类型,它的first元素具有const map<K, V>::key_type类型,而second元素则为map<K, V>::mapped_type类型
map迭代器进行解引用将产生pair类型的对象
3、使用下标访问map对象
map<string, int> word_count; //empty map
//insert default initialized element with key Anna; then assign 1 to its value
word_count["Anna"] = 1;
上述代码将发生以下事情:
-
在word_count中查找键为Anna的元素,没有找到。
-
将一个新的键-值对插入到word_count中。它的键是const string类型的对象,保存Anna.而它的值则采用值初始化,这就意味着在本例中值为0。
-
将这个新的键-值对插入到word_count中
-
读取新插入的元素,并将它的值赋为1
int main()
{
map<string, int> word_count;
string word;
cout << word_count[“Anna”]; // print 0
++word_count[“Anna”];
cout << word_count[“Anna”] << endl; // print 1return 0;
}
4、map::insert的使用
-
m.insert(e) e是一个用在m上的value_type类型的值。如果键(e.first)不在m中,则插入一个值为e.second的新元素;如果该键在m中已存在,则保持m不变。该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素。
-
m.insert(beg, end) beg和end是标记元素范围的迭代器,其中的元素必须为m.value_type类型的键-值对。对于该范围内的所有元素,如果它的键在m中不存在,则将该键及其关联的值插入到m。返回void类型
-
m.insert(iter, e) e是一个用在m上的value_type类型的值。如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返回一个迭代器,指向m中具有给定键的元素
//if Anna not already in word_count, inserts new element with value 1
word_count.insert(map<string, int>::value_type(“Anna”, 1));
//word_count.insert(make_pair(“Anna”, 1));与上一行效果一样
5、查找并读取map中的元素
不修改map对象的查询操作
- m.count(k) 返回m中k的出现次数。对于mpa对象,count成员的返回值只能是0或1。map容器只允许一个键对应一个实例,所以count可有效地表明一个键是否存在。如果返回值非0,则可以使用下标操作符来获取该键所关联的值,而不必担心这样做会在map中插入新元素。
- m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器
6、从map中删除元素
- m.erase(k) 删除m中键为k的元素。返回size_type类型的值,表示删除的元素个数
- m.erase§ 从m中删除迭代器p所指向的元素。p必须指向m中确实存在的元素,而且不能等于m.end()。返回void类型
- m.erase(b, e) 从m中删除一段范围内的元素,该范围由迭代器对b和e标记。b和e必须标记m中的一段有效范围:即b和e都必须指向m中的元素或最后一个元素的下一个位置。而且,b和e要么相等(此时删除的范围为空),要么b所指向的元素必须出现在e所指向的元素之前。返回void类型
7、map 对象的迭代遍历
与其他容器一样, map同样提供begin和end运算,以生成用于遍历整个容器的迭代器
map<string, int> word_count;
...
//get iterator positioned on the first element
map<string, int>::const_iterator map_it = word_count.begin();
//for each element in the map
while (map_it != word_count.end()) {
//print the element key, value pairs
cout << map_it->first << " occurs " << map_it->second << "times" << endl;
++map_it; // increment iterator to denote the next element
}