C++ map详解

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 1

    return 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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值