C++抽象编程——STL(6)——map类的简单使用

The Map class

这次我们谈谈另一个称为map的集合,这个集合概念上类似于字典。我们的字典允许你查找一个字然后来找到它的意思。map是该概念的概括,其提供了称为密钥(kye)的识别标签和相关联的值之间的关联,其可以是更大和更复杂的结构。在字典例子中,key是你正在查找的词,value是它的定义。map在编程中有很多应用。例如,编程语言的解释器需要能够为变量分配值,然后可以通过名称引用值。map可以很容易地保持一个变量的名字和它的对应的值之间的关联。当在这种情况下使用它们时,map通常被称为标签(symbol tables)。
在我们的中文版中,我们称map为映射,意为就像函数一样一一对应,在我看来,就是没必要把它说的那么抽象,人家都称为map了,我们就把它当地图翻译多好,有了地图我们就可以去找我们想要的地方。我们也可以这样理解,key就是化学药品上的标签,value就是里面的药品,我们想在一大堆的药品中找到指定的药物,我们只要找到它对应的标签。

The structure of the Map class

就像我们介绍的,map里面是根据key去查找元素的,所以再声明的时候,肯定要有两个变量类型,一个是key的类型,一个是value的类型,就像这样:

map<string,string> dictionary;

我们当然也可以这样:

map<string,double> symbolTable;

在上面我们定义了一个空的map,key跟value都是没有的,我们可以通过文件导入,或者我们自己添加元素进去。下面我们介绍一下< map>头文件的出口的方法:

下面是解释:

当然这是详细的解释,但是这次我就不做表格了,我前面的几个博文已经做了很多的表格,其实他们的作用都是一样的。我们重点讲讲它的存放方式。先上一段简单的代码:

#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
    map<string, double> symbolTable;
    symbolTable.insert( {"pi", 3.14159} );
    symbolTable.insert( {"e", 2.71828} );
    cout << symbolTable["pi"] << endl;
    cout << symbolTable.at("e") << endl;
    return 0;
}

这里的元素插入很有特点,用了{ }来括住,就像参数列表一样,前面的pi 还有 e 就是这两个数的标签,当我们第一次调用symbolTable.insert( {“pi”, 3.14159} );的时候,存放情况是这样的:


当我们调用这句时:symbolTable.insert( {“e”, 2.71828} );就变为了:

在map中提供了两种访问的方式,就像vector一样,有运算符[ ],还有at()方法。里面的参数就是我们设置的key。
运行结果如下:

下面我们来看复杂一点的例子:

#include <iostream>
#include <map>
#include <utility> // make_pair
int main()
{
    typedef std::map<char, int> MapType;
    MapType my_map;

    // 第一种方法 
    my_map.insert(std::pair<char, int>('a', 1));
    my_map.insert(std::pair<char, int>('b', 2));
    my_map.insert(std::pair<char, int>('c', 3));
    //第二种方法,所有的C++容器都支持这个类型定义 
    my_map.insert(MapType::value_type('d', 4)); 
    //当然我们还可以用 utility 出口的函数 make_pair
    my_map.insert(std::make_pair('e', 5)); 
    // 或者我们用最喜欢的 C++11 的初始化表      
    my_map.insert({'f', 6});                    

    //map中的key是会被自动从低到高排序的 
    //因此,my_map.begin() 指向的是最下面的value而不是key。 
    MapType::iterator iter = my_map.begin();

    // 去除第一个元素 
    my_map.erase(iter);

    // 输出map的大小 
    std::cout << "Size of my_map: " << my_map.size() << '\n';

    std::cout << "Enter a key to search for: ";
    char c;
    std::cin >> c;

    //find方法寻找这个数 
    iter = my_map.find(c);
    if (iter != my_map.end() ) 
        std::cout << "Value is: " << iter -> second << '\n';
    else
        std::cout << "Key is not in my_map" << '\n';

    // 清空map 
    my_map.clear();
}

在这里,std::跟using namespace std是一样的,这里我们介绍了三种方法去输入,最后我们也采用了指针来输出。当然这里有还没介绍的typedef,pair,等。这些后面会好好谈,后面会有个总结的。包括我们STL的用途以及迭代器的解释等等。上面的代码我就不运行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值