stl map 使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

执行结果如下:

技术分享

 

以上是关于stl map 使用的主要内容,如果未能解决你的问题,请参考以下文章

C++STL之map和set的使用

c ++:在c ++ STL中使用map编译错误? [关闭]

STL 之 hash_map源代码剖析

STL 的 hash_map 中的碰撞检测

如何在 STL 映射中迭代 STL 映射?

stl中map的erase具体详解