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

来源:互联网 发布:format java 编辑:程序博客网 时间:2024/05/20 05:04

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_pairint 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
原创粉丝点击