zoukankan      html  css  js  c++  java
  • C++学习之map类型 分类: 数据结构与算法 2015-07-17 15:07 11人阅读 评论(0) 收藏

    1。目录
    1. map简介
    2. map的功能
    3. map的定义
    4. 在map中添加元素
    5. 查找并获取map中的元素
    6. 从map中删除元素
    7. map对象的迭代遍历 

    2。map简介

    map是一类关联式容器,它是模板类。关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置类获取。它的特点是增加和删除节点对迭代器的影响很小,除了操作节点,对其他的节点都没有什么影响。对于迭代器来说,不可以修改键值,只能修改其对应的实值。

     

    3。map的功能

    1. 自动建立Key - value的对应。key 和 value可以是任意你需要的类型,但是需要注意的是对于key的类型,唯一的约束就是必须支持<操作符
    2. 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
    3. 快速插入Key - Value 记录。
    4. 快速删除记录
    5. 根据Key 修改value记录。
    6. 遍历所有记录。

    4。map的定义

    使用map得包含map类所在的头文件:#include <map> //注意,STL头文件没有扩展名.h

    map对象是模板类,需要关键字和存储对象两个模板参数,基本的定义模式如下:


    std:map<int, string> personnel;


    这样就定义了一个以int为键,值为string的map对象personnel。

     

    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类型

    对迭代器进行解引用时,将获得一个引用,指向容器中一个value_type类型的值,对于map容器,其value_type是pair类型。

     

    为了使用方便,可以对模板类进行一下类型定义,

    typedef map<int, CString> UDT_MAP_INT_CSTRING; 
    UDT_MAP_INT_CSTRING enumMap;

     

    5。在map中添加元素

     

    给map中添加元素主要有两种方法:

    •   使用下标操作符获取元素,然后给元素赋值

              For example:

              map<string, int> word_count; // 定义了一个空的map对象word_count;

              word_count["Anna"] = 1;

             

              程序说明:

              1.在word_count中查找键为Anna的元素,没有找到.

              2.将一个新的键-值对插入到word_count中,他的键是const string类型的对象,保存Anna。而他的值则采用直初始化,这就意味着在本例中指为0.

              3.将这个新的键-值对插入到word_count中

              4.读取新插入的元素,并将她的值赋为1.

              使用下标访问map与使用下标访问数组或者vector的行为是截然不同的:使用下标访问不存在的元素将导致在map容器中添加一个新的元素,他的键即为该下标值。

    • 使用map::insert方法添加元素

              map容器提供的insert操作:

              1. map.insert(e) : e是一个用在map中的value_type类型的值。如果键不存在,则插入一个值为e.second的新元素;如果键在map中已经存在,那么不进行任何操作。该函数返回一个pair类型,该pair类型的first元素为当前插入e的map迭代器,pair的second类型是一个bool类型,表示是否插入了该元素。

              2. map.insert(beg, end) : beg和end是迭代器,返回void类型

              3. map.insert(iter, e) : e是value_type类型的值,如果e.first不在map中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置,返回一个迭代器,指向map中具有给定键的元素。

             

              For example:

     

              word_count.insert(map<sting, int>::value_type("Anna", 1));

     

              word_count.insert(make_pair("Anna", 1)); 

     

              返回值:如果该键已在容器中,则其关联的值保持不变,返回的bool值为true。

    word_count["Anna"]=2;

             这个表达示是能够改变的该键的值的,此时Anna对应的值变为2。

    6。查找并获取map中的元素

    使用下标获取元素存在一个很危险的副作用:如果该键不在map容器中,那么下标操作会插入一个具有该键的新元素。

    因此引入map对象的查询操作:

    map.count(k) : 返回map中键k的出现次数(对于map而言,由于一个key对应一个value,因此返回只有0和1,因此可以用此函数判断k是否在map中)

    map.find(k) :  返回map中指向键k的迭代器,如果不存在键k,则返回超出末端迭代器。

     

    For example:

     

    int occurs = 0;

    if( word_count.cout("foobar") )

         occurs = word_count["foobar"];

     

    int occurs = 0;

    map<string, int>::iterator it = word_count.find("foobar");

    if( it != word_count.end() )

         occurs = it ->second;

     

     

    7。从map中删除元素

    移除某个map中某个条目用erase()

    该成员方法的定义如下:

    1. iterator erase(iterator it); //通过一个条目对象删除
    2. iterator erase(iterator first, iterator last);        //删除一个范围
    3. size_type erase(const Key& key); //通过关键字删除

    8. map对象的迭代遍历

    与其他容器一样,map同样提供begin和end运算,以生成用于遍历整个容器的迭代器。 

  • 相关阅读:
    对实时的视屏流进行处理
    opencv读取并播放avi视屏
    opencv中读取显示图像
    为什么既要有IP地址还要有MAC地址
    继承中构造、析构 与 拷贝构造、赋值中的调用区别
    拷贝构造函数和赋值符函数——转
    inline修饰虚函数的问题
    菱形继承产生的问题及解决
    迭代器模式
    备忘录模式
  • 原文地址:https://www.cnblogs.com/zclzqbx/p/4687058.html
Copyright © 2011-2022 走看看