STL容器类map学习

来源:互联网 发布:知乎玲珑邪僧 编辑:程序博客网 时间:2024/05/23 02:00

 map类定义了一个关联容器,并且在容器中使用唯一的关键字(任何两个元素的键都不相同)来映射相应的值。从本质上来说,关键字就是值的名字。在map对象中存储了一个值之后,就可以通过关键字来获得它。map对象是一系列关键字/值的匹配对。
   map的主要功能在于:只有你知道了一个值的关键字,就能够找到这个值。例如,定义一个map对象m,在该对象中使用人名作为关键字,并将每个人的电话号码存储为值。那么可以使用m[“张三”]表示张三的电话号码。从前面的例子可以看出map类有一个非常优越的特点:关联数组。在普通的数组中,索引是一个整数。而在关联数组中,索引是一个键,并且键可以是任意类型的,可以是String、double、int类型,甚至可以是一些用户定义的类。
    map和set的插入删除效率比用其他序列容器高,因为对于关联容器来说,不需要做内存拷贝和内存移动。map和set容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多,指向父节点和子节点。结构图可能如下:

            A
           / /
          B   C
         / / / /
        D  E F  G

因此插入的时候只需要稍做变换,把节点的指针指向新的节点就可以了。删除的时候类似,稍做变换后把指向删除节点的指针指向其他节点就OK了。这里的一切操作就是指针换来换去,和内存移动没有关系。
   每次insert之后,以前保存的iterator不会失效,因为iterator是指向节点的指针,内存没有变,指向内存的指针当然不会失效。

函数列表如下:
begin() 返回指向map头部的迭代器 
clear() 删除所有元素 
count() 返回指定元素出现的次数 
empty() 如果map为空则返回true 
end() 返回指向map末尾的迭代器 
equal_range() 返回特殊条目的迭代器对 
erase() 删除一个元素 
find() 查找一个元素 
get_allocator() 返回map的配置器 
insert() 插入元素 
key_comp() 返回比较元素key的函数 
lower_bound() 返回键值>=给定元素的第一个位置 
max_size() 返回可以容纳的最大元素个数 
rbegin() 返回一个指向map尾部的逆向迭代器 
rend() 返回一个指向map头部的逆向迭代器 
size() 返回map中元素的个数 
swap() 交换两个map 
upper_bound() 返回键值>给定元素的第一个位置 

value_comp() 返回比较元素value的函数


示例:
#include<iostream>
#include <fstream>
#include<map>
#include<string>
using namespace std;
void main()
{
    map<string,int> m,n;
    string key;int value;
    value=1;key="A12";
    m[key]=value;
    value=5;key="A3";
    m[key]=value;
    m["D5"]=4;
    m["A2"]=5;
    map<string,int>::iterator p=m.begin();//定义m对象的迭代器,并输出m中所有项
    p++;p++;
    m.insert(p,pair<string,int>("A1",7));
    m["B6"]=3;
    p=m.begin();
    for (int i=0; i<m.size(); i++)
   {
      cout <<p->first <<" "<<p->second <<endl;//first指向关键字,second指向值
      p++;
   }
   cout<<m.count("E")<<endl;
}
输出结果:
        A1 7
        A12 1
        A2 5
        A3 5
        B6 3
        D5 4
        0



0 0