stl map 使用

  map是stl提供的一个关联容器,提供一对一的数据处理能力。第一个值为关键字,在map中只能出现一次,第二个值为关键字的值。map内部自建一颗红黑树,具有自动排序的功能。不管你以什么顺序插入值,map会按照关键字key的大小进行自动排序。

1.map的构造

  map<int,string> mapStudent;

2.map的插入

  共有3种插入方法:

  (1).insert + pair

    mapStudent.insert(pair<int, string>("1, student_1"));

  (2).insert + valuetype

    mapStudent.insert(map<int, string>::valuetype("2, student_2"));

  (3).数组

    mapStudent[3] = "student_3";

  区别:前2种方法是相同的,在map中已经有该key的情况下,会插入失败,需要校验返回值;第3中方法在map中已经有该key的情况下,以覆盖写的形式插入。

  前2种方法的插入校验:

  pair<map<int, string>::iterator, bool> pairInsert;

  pairInsert = mapStudent.insert(pair<int, string>("2, student_5"));

  if(true == pairInsert.second)

  {

    cout << "Insert success." << endl;

  }

3.map的遍历

  (1).前向遍历器 iterator

    for(map<int, string>::iterator iter = mapStudent.begin(); iter != mapStudent.end(); iter++ )

    {

      cout << iter->first << " " << iter->second << endl;

    }

  (2).反向遍历器 reverse_iterator

    for(map<int, string>::reverse_iterator riter = mapStudent.rbegin(); riter!= mapStudent.rend(); riter++)

    {

      cout << riter->first << " " << iter->second << endl;

    }

4.map的大小

  int nSize = mapStudent.size();

5.map的查找

  map<int, string>::iterator fiter = mapStudent.find(1);

6.map是否为空

  mapStudent.empty();

7.map的数据删除

  同样有3种删除方法:

  (1).通过迭代器删除1个

    mapStudent.erase(iter);

  (2).通过key

    mapStudent.erase(2);

  (3).通过迭代器删除一片[begin, end)

    mapStudent.erase(mapStudent.begin(), mapStudent.end());

测试代码如下:

#include<map>
#include<string>
#include<iostream>
using namespace std;

int main()
{
    map<int,string> mapStudent;
    //插入方式1: insert + pair
    mapStudent.insert(pair<int, string>(1, "student_1"));

    //插入方式2: insert + valuetype
    mapStudent.insert(map<int, string>::value_type(2, "student_2"));

    //插入方式3: 数组方式
    mapStudent[3] = "student_3";
    mapStudent[5] = "student_5";
    mapStudent[6] = "student_6";
    mapStudent[4] = "student_4";

    //区别:前2种插入方式相同,在已有key的情况下,再次插入相同key会失败;而方式3会以覆盖写的方式插入。
    //方式3覆盖写
    mapStudent[1] = "student_4";
    //方式1/2 插入失败
    pair<map<int, string>::iterator, bool> pairInsert;
    pairInsert = mapStudent.insert(pair<int, string>(2, "student_5"));
    if(true == pairInsert.second)
    {
        cout << "Method 1/2 overwrite insert success." << endl;
    }
    else
    {
        cout << "Method 1/2 overwrite insert fail." << endl;
    }

    //前向迭代器遍历
    for(map<int, string>::iterator iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first << "  " << iter->second << endl;
    }

    //反向迭代器遍历
    cout << endl << "reverse_iterator:" << endl;
    for(map<int, string>::reverse_iterator riter = mapStudent.rbegin(); riter != mapStudent.rend(); riter++)
    {
        cout << riter->first << "  " << riter->second << endl;
    }

    //map大小
    int nSize = mapStudent.size();
    cout << endl << "mapStuent size is " << nSize << endl;

    //map查找
    map<int, string>::iterator finditer = mapStudent.find(1);
    if(finditer != mapStudent.end())
    {
        cout << endl << "key=1 find value is " << finditer->second << endl;
    }

    //map删除1:迭代器
    map<int, string>::iterator eraseiter = mapStudent.find(1);
    if(eraseiter != mapStudent.end())
    {
        mapStudent.erase(eraseiter);
    }

    //map删除2:通过key
    mapStudent.erase(2);

    for(map<int, string>::iterator niter = mapStudent.begin(); niter != mapStudent.end(); niter++)
    {
        cout << niter->first << "  " << niter->second << endl;
    }

    //map删除3:[begin, end)
    mapStudent.erase(mapStudent.begin(), mapStudent.end());
    //map是否为空
    if(mapStudent.empty())
    {
        cout << "mapStudent is empty." << endl;
    }

    return 0;
}

执行结果如下:

时间: 2024-10-11 04:24:58

stl map 使用的相关文章

stl::map之const函数访问

如何在const成员数中访问stl::map呢?例如如下代码: string ConfigFileManager::MapQueryItem(const string& name) const { if (_map_name_value.find(name) != _map_name_value.end()) { return _map_name_value[name]; } return ""; } 上面的代码会报错:error C2678: 二进制“[”: 没有找到接受“c

hdu 4941 Magical Forest(STL map &amp; 结构体运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 220    Accepted Submission(s): 105 Problem Description There is a forest c

(转载)STL map与Boost unordered_map的比较

原链接:传送门 今天看到 boost::unordered_map,它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中.所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的.顺序就是按照operator< 定义的大小排序.而boost::unordered_map是计算元素的Hash值,根据Hash值判断元素是否相同.所以,对unordered_map进行遍历,结果是无序的. 用法的区别就是

ZOJ1109_Language of FatMouse(STL/map)

解题报告 题意: 略. 思路: map应用. #include <algorithm> #include <iostream> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <cstdio> #include <map> using namespace std; map<string,stri

POJ训练计划3096_Surprising Strings(STL/map)

解题报告 题目传送门 题意: 给一个字符串,要求,对于这个字符串空隔为k取字符对(k=0,1,2,3,4...)要求在相同的空隔取对过程汇总,整个字符串中没有一个相同字符对如: ZGBZ: 间隔为0的字符对有: ZG.GB.BZ,三个均不相同 间隔为1的字符对有: ZG. GZ,均不相同 间隔为2的字符对有: ZZ 仅有一个,不必比较. 这种字符串定义为"surprising". 之后按照格式输出. 思路: map暴力. #include <iostream> #inclu

支持泛型AVL Tree的简单实现,并和STL map比较了插入,删除,查找的性能

1.问题描述: 1)AVL tree是一种自平衡树.它通过左右子树的高度差来控制树的平衡,当高度差是不大于1的时候,认为树是平衡的.树的平衡保证了树在极端情况下 (输入序列不够随机)的性能.很显然当左右子树高度平衡,保证了任何插入,删除,查找操作平均性能呢个,当不平衡时(有的子树很高),当 要操作的元素在这个子树时,性能会很差: 2)AVL tree 和Red black tree 都是一种平衡树,它的操作的时间复杂度是:O(lgN) ,N是树的节点的数目: 3)本文实现了AVL Tree, 并

泛型Binary Search Tree实现,And和STL map比较的经营业绩

问题叙述性说明: 1.binary search tree它是一种二进制树的.对于key值.比当前节点左孩子少大于右子. 2.binary search tree不是自平衡树.所以,当插入数据不是非常随机时候,性能会接近O(N).N是树中节点数目; 3.理想状态下.时间复杂度是O(lgN), N是树中节点的数目: 4.以下给出一个简单的实现,并比較其和STL map的性能.一样的操作,大约耗时为STL map 的2/3. 代码例如以下: #ifndef _BINARY_SEARCH_TREE_H

hdu4941 Magical Forest (stl map)

2014多校7最水的题   Magical Forest Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 253    Accepted Submission(s): 120 Problem Description There is a forest can be seen as N * M gri

扩展封装暴雪哈希算法(blizard hash algorithm),并与STL map进行操作性能上的比较

问题描述: 1.blizard hash algorithm 是众所周知的算法,关于它极小的碰撞概率和实现的简洁性一直为热爱技术的朋友津津乐道: 2.blizard hash algorithm 有个致命的问题就是它的实现受制于一个固定的(预先开辟的buffer)的限制,暴雪给出的是1024,也即当hash table 的填充的元素(key value pair)查过1024时,就没办法再往里面进行key value 对填充,这极大的限制了它的使用.在实现的应用,我们经常会向hash table

[CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map

13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the number of inputs is small, which data structure options can be used instead of a hash table? 这道题让我们比较哈希表和STL中的map数据结构,在遇到这道题之前,我一直以为map就是c++中的哈希表呢,原来是不同的啊-