• stl之map容器的原理及应用


    容器的数据结构同样是采用红黑树进行管理,插入的元素健位不允许重复,所使用的节点元素的比较函数,只对元素的健值进行比较,元素的各项数据可通过健值检索出来。map容器是一种关联容器,实现了SortedAssociative Container、Sorted Associative Container和Unique Associative Container概念的接口规范。

    map技术原理

    图中所示是map容器的一个元素的数据组成,可通过pair封装成一个结构对象。map容器所要做的,就是将这个pair对象插入到红黑树,完成一个元素的添加。同时,也要提供一个仅使用键值进行比较的函数对象,将它传递给红黑树。由此,就可利用红黑树的操作,将map元素数据插入到二叉树中的正确位置,也可以根据键值进行元素的删除和检索。

    map应用基础

    头文件:#include<map>

    创建map对象

    1)map(); //创建一个没有任何元素的map对象

    2)map(constkey_compare& comp); //指定一个比较函数对象comp来创建map对象,内存分配器为默认值。

    3)map(constmap&); //拷贝构造函数,用一个map容器的元素和比较函数,拷贝生成一个新的map容器对象。

    4)map(InputIteratorfirst, InputIterator last); //用迭代器区间[first)所指的数据,作为map容器的元素(包括键值和映照数据),创建一个map容器对象。

     1 #include <iostream>
     2 #include <map>
     3 using namespace std;
     4 struct classcomp {
     5     bool operator() (const char& lhs, const char& rhs) const
     6     {return lhs<rhs;}
     7 };
     8 int main ()
     9 {
    10     //创建map对象
    11     map<char,int> first;
    12     map<char,int,classcomp> fourth;   
    13     map<char,int> third (second);
    14     map<char,int> second (first.begin(),first.end());            
    15     return 0;
    16 }

    元素的插入

    除可使用如下的insert函数,将整个元素数据进行插入外,常用map容器的数组操作"[]",显式地为不同键值赋予内容(映照数据),不过这个数组方法,不能检测是否插入成功。

    1)pair<iterator,bool>insert(const value_type& v)

    将元素v(包括键值和映照数据)插入map容器,重复的v值不被插入。返回一个pair配对对象,提供所插入元素的迭代器位置和true/false插入成功标志。

    2)iteratorinsert(iterator position, const value type& v)

    将元素v(包括键值和映照数据)插入map容器,参数position只是提示可在position位置之前插入v,所返回的插入位置视情况而定,不一定在position位置前插入。

    3)voidinsert(InputIterator first, InputIterator last)

    将迭代器区间[first,last)所指的数据作为容器元素(包括键值和映照数据),插入到map容器中。

    1 //"[]"
    2 map<char,std::string> mymap;
    3 mymap['a']="an element";
    4 mymap['b']="another element";
    5 mymap['c']=mymap['b'];
     1 // map::insert
     2 #include <iostream>
     3 #include <map>
     4 using namespace std;
     5 int main ()
     6 {
     7     map<char,int> mymap;
     8     //insert函数版本
     9     mymap.insert ( pair<char,int>('a',100) );
    10     mymap.insert ( pair<char,int>('b',200) );
    11 
    12     pair<map<char,int>::iterator,bool> ret;
    13     ret = mymap.insert ( std::pair<char,int>('b',500) );
    14     if (ret.second==false) {
    15         cout << "元素'b' 已经存在";
    16         cout << " 其值为" << ret.first->second << '
    ';
    17     }
    18     // insert函数版本
    19     map<char,int>::iterator it = mymap.begin();
    20     mymap.insert (it, pair<char,int>('b',300));  // 最高效的插入
    21     mymap.insert (it, std::pair<char,int>('c',400));  //非最高效的插入
    22     //insert函数版本
    23     map<char,int> anothermap;
    24     anothermap.insert(mymap.begin(),mymap.find('c'));
    25     //输出容器:
    26     cout << "mymap 包含:
    ";
    27     for (it=mymap.begin(); it!=mymap.end(); ++it)
    28         cout << it->first << " => " << it->second << '
    ';
    29     cout << "anothermap 包含:
    ";
    30     for (it=anothermap.begin(); it!=anothermap.end(); ++it)
    31         cout << it->first << " => " << it->second << '
    ';
    32     system("pause");
    33     return 0;
    34 }

    元素的删除

    1. void erase(iteratorposition); 删除 position所指的元素
    2. size_type erase(const key_type& k);  删除等于键值 k的那个元素,对于map容器来说,此函数总是返回值1,因为map容器不会出现重复的元素值(键值)
    3. void erase(iterator first, iterator last); 删除map迭代器区间 [first,last)上的所有元素
    4. void clear(); 删除map容器的所有元素

     1 #include <iostream>
     2 #include <map>
     3 using namespace std;
     4 int main ()
     5 {
     6     map<char,int> mymap;
     7     map<char,int>::iterator it;
     8     // 插入一些元素:
     9     mymap['a']=10;
    10     mymap['b']=20;
    11     mymap['c']=30;
    12     mymap['d']=40;
    13     mymap['e']=50;
    14     mymap['f']=60;
    15     it=mymap.find('b');
    16     mymap.erase (it);                   // 删除迭代器所指元素
    17     mymap.erase ('c');                  //删除键值为'c'的元素
    18     it=mymap.find ('e');
    19     mymap.erase ( it, mymap.end() );    //删除区间内的元素
    20     for (it=mymap.begin(); it!=mymap.end(); ++it)
    21         cout << it->first << " => " << it->second << '
    ';
    22     return 0;
    23 }

    其他成员函数用法与前篇set容器相似,不再赘述。

    直观来说,map容器区别于set容器的一个主要特性在于,map是处理带有键值的记录型元素数据的快速插入、删除和检索,而set则可看成是对单一数据的处理。map将一个元素划分出键值部分,并按这个局部的键值制定整个元素的函数比较规则,来建立容器的数据分布。map的元素键值是唯一的,不允许重复的元素键值插入。set和map都是泛型库对二叉树的一个泛化。

    转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46762505,谢谢合作!

  • 相关阅读:
    SAP S/4HANA OData Mock Service 介绍
    SAP S/4HANA Cloud SDK 入门介绍
    SAP Cloud SDK for JavaScript 的搭建和使用方法介绍
    SAP Cloud SDK for JavaScript 概述
    如何在 SAP BTP ABAP 编程环境里直接调用 ABAP On-Premises 系统的 RFC 函数
    3-16计划
    HBASE基础(5):语法(3) API (2) DML
    HBASE进阶(3):重要工作机制(2)读流程
    HBASE进阶(2):重要工作机制(1) 写流程/MemStore Flush
    JavaWeb 之 Ajax
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/4873683.html
Copyright © 2020-2023  润新知