• map--C++ STL 学习


    map–C++ STL 学习

      Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。
      说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的
    map是使用红黑树实现的,访问、查找和删除操作的复杂度都是O(logn)。

    template<
        class Key,    //键
        class T,      //值
        class Compare = std::less<Key>,   // 
        class Allocator = std::allocator<std::pair<const Key, T> 
    > class map;

    (1)map的创建

    map共提供了6个构造函数,这块涉及到内存分配器这些东西,略过不表,在下面我们将接触到一些map的构造方法,这里要说下的就是,我们通常用如下方法构造一个map:

    Map<int, string> mapStudent;

    (2)遍历操作

    遍历map无疑就需要使用到迭代器,下面列出了四种map迭代器

    iterator begin();   //返回指向起始元素的迭代器
    iterator rbegin();  //返回指向末尾元素的迭代器
    
    iterator end();     //返回指向末尾元素的后一个的迭代器
    iterator rend();    //返回指向起始元素的前一个的迭代器

    (3)插入操作

    1.使用[]插入
    直接使用[]插入,如果mymap中不存在键值为”abc”元素,那么就执行插入操作。

    mymap["abc"] = 1;

    2.插入单个元素

    //函数原型:
    std::pair<iterator,bool> insert( const value_type& value ); //这里的返回值:bool表示插入是否成功、iterator返回插入的位置
    //操作示例:
    mymap.insert( map<int, string>::value_type(1, "one") );

    3.插入多个元素

    //函数原型:
    template< class InputIt >
        void insert( InputIt first, InputIt last );
    //操作示例:
    map<int, string> tmp = {
        {5, "five"},
        {6, "six"}
    };
    mymap.insert( tmp.begin(),tmp.end() );

    4. 使用std::initializer_list插入
    C++11中新加入的插入数据方式:

    //函数原型:
    void insert( std::initializer_list<value_type> ilist ); 
    //操作示例:
    mymap.insert( { {7, "seven"}, {8, "eight"}, {9, "nine"} } );

    (4)删除操作

    1. 删除指定位置的元素

    //函数原型:
    iterator erase( iterator pos ); 
    //具体示例:
    std::map<std::string,int>::iterator it = mymap.erase(mymap.begin()); //返回删除元素的下一个元素的迭代器

    2. 删除指定范围的元素

    //函数原型:
    iterator erase( const_iterator first, const_iterator last ); 
    //具体示例:
    mymap.erase(mymap.begin(), mymap.end()); //删除所有的元素

    3. 依据键值删除元素

    //函数原型:
    size_type erase( const key_type& key ); 
    //具体示例:
    int num = mymap.erase("abc");

    PS:方法一和方法二的返回值都是删除元素的下一个元素的迭代器,在C++11之前他们都是没有返回值的。方法三的返回值是删除元素的数目。

    (5)max_size(),最大容纳量;size(),当前的元素个数

    cout << "map中的最大容量为:" << map1.max_size() << endl;
    cout << "map中的元素个数为:" << map1.size() << endl;

    (6)empty(),判断map是否为空

    cout << "map是否为空:" << map1.empty() << endl;

    如果为空,返回1.否则返回0。

    (7)swap():交换两个map中的值。

    (8)[],at(),取某位置的元素值

    // 取map中某位置的元素值
    cout << "在1位置的元素值为:" << map1.at(1) << endl;
    cout << "在1位置的元素值为:" << map1[1] << endl;

    (9)[],at():修改元素

    // 修改map中的某个值
    map1[2] = 99;
    
    map1.at(3) = 88;

    (10)clear():清除所有元素

    // 清除所有数据
       map1.clear();
       cout << "map是否为空:" << map1.empty() << endl;

    执行以后就是一个空的map,不包含任何元素。

    其他方法

    size_type count( const Key& key ) const; //返回关键字为key的元素的个数,在map里结果不是0就是1
    iterator find( const Key& key ); //返回key所在位置的迭代器,如果没有找到则返回end()

    关于map的更详细介绍可以参考文档:http://en.cppreference.com/w/cpp/container/map

  • 相关阅读:
    Linux Centos7之由Python2升级到Python3教程
    10张图带你深入理解Docker容器和镜像
    Centos7 添加用户及设置权限
    OpenCV 和 Dlib 人脸识别基础
    python unittest 源码学习
    Markdown 模板
    python Django ORM相关
    java的介绍
    java反射
    代理模式
  • 原文地址:https://www.cnblogs.com/yangjiannr/p/7391357.html
Copyright © 2020-2023  润新知