zoukankan      html  css  js  c++  java
  • C++STL—map的使用

    最近写的一道题用到了STL中的map,这部分内容之前没有系统学过,这里就简单归纳一下吧。

    资料来源:

    https://www.w3cschool.cn/cpp/cpp-fu8l2ppt.html

    http://c.biancheng.net/view/338.html

    https://blog.csdn.net/u010429424/article/details/75332700

    常用操作:

    1. 添加元素:可以用Insert,也可以下标添加
       map<int ,string> maplive;  
       1.maplive.insert(pair<int,string>(102,"aclive"));
       2.maplive.insert(map<int,string>::value_type(321,"hai"));
       3, maplive[112]="April";//map中最简单最常用的插入添加!

      2.查找:注意,map中元素是key-value配对的,要查找一个元素,需要提供它的key。map的内部是以平衡二叉树形式储存的,所以查找的速度为O(logn),速度很快。

      另外,这也意味着,map内部的元素是有序的!所以我们如果只是需要一个按key排序的输出的话,不需要对map进行排序,直接遍历输出即可。

      3.遍历:map的遍历是通过迭代器完成的:

    1) 正向迭代器,定义方法如下:()

    容器类名::iterator  迭代器名;


    2) 常量正向迭代器,定义方法如下:

    容器类名::const_iterator  迭代器名;


    3) 反向迭代器,定义方法如下:

    容器类名::reverse_iterator  迭代器名;


    4) 常量反向迭代器,定义方法如下:

    容器类名::const_reverse_iterator  迭代器名;

    遍历过程:

    map<int, int>::iterator iter;
        iter = _map.begin();
        while(iter != _map.end()) {
            cout << iter->first << " : " << iter->second << endl;
            iter++;
        }

    注意这里的map.end(),它和map.begin(),map.lower_bound(),map.upper_bound()一样,返回的是一个迭代器而不是元素本身。

    *易错点:

    map::lower_bound(key):返回map中第一个大于或等于key的迭代器指针

    map::upper_bound(key):返回map中第一个大于key的迭代器指针

    另外:

      1.对于map中没有的key,如果访问的话返回的value为0;

      2.map虽然有“下标”访问并且内部元素是有序的,但这不代表可以实现类似数组的下标访问,即访问第0个、第1个·····第n个元素。

      3.map中的end()指向的不是最后一个元素,而是最后一个元素的下一个元素,这样是为了遍历时的方便,即使用while(iter != _map.end())的条件变量时可以遍历到最后一个元素。

    举个例子:

     

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    map<int,int>testmap;
    testmap[0]=8;
    testmap[2]=9;
    //重要!end()指向的是下一个而非尾部
    cout<<"begin's first:" <<testmap.begin()->first<<"begin's second:"<<testmap.begin()->second<<" end's first: "<<testmap.end()->first<<endl;
    cout<<testmap[1]<<endl;
    getchar();
    }

     

    结果为:

    map<int ,string> maplive; 1.maplive.insert(pair<int,string>(102,"aclive")); 2.maplive.insert(map<int,string>::value_type(321,"hai")); 3, maplive[112]="April";//map中最简单最常用的插入添加!

  • 相关阅读:
    BZOJ 3506 机械排序臂 splay
    BZOJ 2843 LCT
    BZOJ 3669 魔法森林
    BZOJ 2049 LCT
    BZOJ 3223 文艺平衡树 splay
    BZOJ 1433 假期的宿舍 二分图匹配
    BZOJ 1051 受欢迎的牛 强连通块
    BZOJ 1503 郁闷的出纳员 treap
    BZOJ 1096 ZJOI2007 仓库设计 斜率优化dp
    BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
  • 原文地址:https://www.cnblogs.com/jiading/p/11089999.html
Copyright © 2011-2022 走看看