zoukankan      html  css  js  c++  java
  • 我不熟悉的map

    讲map之前,其实很多都在set那篇讲过了。我不熟悉的set

    很多的API都类似,不会再累述。

    map和set都是用红黑树实现的,但是set只能存单个值,它的key和value都是同一个,map不一样,它的每一个key都映射一个value.

    接下来先介绍一些map自己的东西,再把和set一样的提一下。

    四种插入新键值对的方式

    现在我们定义一个空的map:

    map<int,string> m;
    

    下面展示四种方式。

    一、pair方式

    m.insert(pair<int,string>(10,"Tom"));
    

    这是通过创建一个pair的匿名对象来保存数据。

    二、make_pair

    m.insert(make_pair(0,"Jerry"));
    

    我们知道,make_pair就返回一个对组,这个对组就能直接赋值给map。

    三、value_type方式

    m.insert(map<int,string>::value_type(1,"Super"));
    

    通过map内置的一个value_type来赋值。

    四、直接插入

    m[9] = "John";
    

    这个方法看起来是最简单的,却暗藏杀机。当我们写以下语句:

    m[100];
    

    我们没有给它一个value,本意可能不想插入,但是一旦我们这么写,它就会给我们默认插进去,value为默认值。所以这个方法很可能使用不当。所以建议采用第二种创建方式,比较短,而且不容易出错。

    如果访问key和value

    map保存了两个值,提供了first和second两个函数来访问key和value,互相对应。

    如下:

    int main()
    {
        map<int, string> m;
    	m.insert(make_pair(0, "Jerry"));
    	m.insert(map<int, string>::value_type(1, "Super"));
    	m[9] = "John";
    	m[100];
    	for (auto mapIt = m.begin(); mapIt != m.end(); ++mapIt)
    		cout << "key:" << mapIt->first << " value:" << mapIt->second << endl;
    	return 0;
    }
    

    输出:

    可以看到:

    • 同样也以key排好序了。
    • 且m[100]也插入了一个空。
    • 我们通过迭代器调用了second和first来访问key和value。

    同样的,插入也返回一个pair<iterator,bool>类型。

    指定规则排序

    与set无异,在创建的同时就指定排序规则。将上述代码中,声明m的语句改为:

    // MyCmp是仿函数。
    map<int,string,MyCmp> m;
    

    其它操作

    查找操作

    与set无异。

    find(key);     //查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
    count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
    lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
    upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
    equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
    

    大小操作

    size();//返回容器中元素的数目
    empty();//判断容器是否为空
    

    与set无异。

    删除操作

    clear();    //删除所有元素
    erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
    erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
    erase(keyElem);//删除容器中key为keyElem的对组。
    

    与set无异。

  • 相关阅读:
    STL堆算法性能分析与优化方法(GCC4.4.2 stl_heap.h源代码分析与改进方案)
    POJ 1631 Bridging Singnals
    一个用于读unicode文本的迭代器(iterator)
    常用文本压缩算法及实现(To be finshed!)
    volatile语义及线程安全singleton模式探讨
    C++实现的huffman与canonical huffman的压缩解压缩系统,支持基于单词的压缩解压缩
    linux环境下 C++性能测试工具 gprof + kprof + gprof2dot
    多线程统计多个文件的单词数目C++0x多线程使用示例
    python嵌入C++ boost.python如何在C++中调用含有不定长参数tuple变量和关键字参数dict变量的函数
    boost.python入门教程 python 嵌入c++
  • 原文地址:https://www.cnblogs.com/love-jelly-pig/p/9995967.html
Copyright © 2011-2022 走看看