STL map部分用法示例

白昼怎懂夜的黑 提交于 2019-11-26 18:36:33

1. map的构造函数

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

map<int, string> mapStudent;

 

2. 数据的插入

在构造map容器后,我们就可以往里面插入数据了。这里讲三种插入数据的方法:

 

第一种:用insert函数插入pair数据

#include    <map>
#include    <stdlib.h>
#include    <iostream>
#include    <string>
using namespace std;

    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent;
    map<int,string>::iterator iter;

    mapStudent.insert (pair<int, string> (1, "One"));
    mapStudent.insert (pair<int, string> (2, "Two"));
    mapStudent.insert (pair<int, string> (3, "Three"));
    for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first << "  " << iter->second << endl;
    }

    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

第二种:用insert函数插入value_type数据,下面举例说明

#include    <stdlib.h>
#include    <string>
#include    <map>
#include    <iostream>
using namespace std;


    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent;
    map<int, string>::iterator iter;

    mapStudent.insert (map<int, string>::value_type (1, "one"));
    mapStudent.insert (map<int, string>::value_type (2, "two"));
    mapStudent.insert (map<int, string>::value_type (3, "three"));

    for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first << " " << iter->second << " " << &iter << endl;
    }
    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

第三种:用数组方式插入数据,下面举例说明

#include    <stdlib.h>
#include    <string>
#include    <map>
#include    <iostream>
using namespace std;


    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent;
    map<int, string>::iterator iter;

    mapStudent[1] = "one";
    mapStudent[2] = "two";
    mapStudent[3] = "three";

    for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }

    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

演示插入成功与否问题

#include    <map>
#include    <string>
#include    <iostream>
#include    <stdlib.h>
using namespace std;

    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent;
    map<int, string>::iterator iter;
    pair<map<int,string>::iterator, bool> InsertPair;

    InsertPair = mapStudent.insert (pair<int, string> (1, "one"));
    if (InsertPair.second == true)
    {
        cout << "Insert Successfully" << endl;
    }
    else
    {
        cout << "Insert Failure" << endl;
    }

    InsertPair = mapStudent.insert (pair<int, string> (1, "two"));
    if (InsertPair.second == true)
    {
        cout << "Insert Successfully" << endl;
    }
    else
    {
        cout << "Insert Failure" << endl;
    }

    for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first << "  " << iter->second << "  " << &iter << endl;
    }
    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

大家可以用如下程序,看下用数组插入在数据覆盖上的效果

#include    <map>
#include    <string>
#include    <iostream>
#include    <stdlib.h>
using namespace std;


    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent;
    map<int, string>::iterator iter;
    int nSize;

    mapStudent[1] = "one";
    mapStudent[2] = "two";
    mapStudent[2] = "three";
    for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
    nSize = mapStudent.size();
    cout << "Size of mapStudent is : " << nSize << endl;
    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

3. map的大小

在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下

int nSize = mapStudent.size();

 

4. 数据的遍历

这里也提供三种方法,对map进行遍历

第一种:应用前向迭代器,上面举例程序中到处都是了,略过不表

第二种:应用反相迭代器,下面举例说明

#include    <stdlib.h>
#include    <string>
#include    <map>
#include    <iostream>
using namespace std;

    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent;
    map<int, string>::reverse_iterator iter;

    mapStudent.insert (pair<int, string> (1, "one"));
    mapStudent.insert (pair<int, string> (2, "two"));
    mapStudent.insert (pair<int, string> (3, "three"));

    for (iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

第三种:用数组方式,程序说明如下

#include    <map>
#include    <string>
#include    <iostream>
#include    <stdlib.h>
using namespace std;

    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent;
    int nSize;

    mapStudent.insert (pair<int, string> (1, "one"));
    mapStudent.insert (pair<int, string> (2, "two"));
    mapStudent.insert (pair<int, string> (3, "three"));
    nSize = mapStudent.size();

    for (int nIndex = 1; nIndex <= nSize; nIndex++)
    {
        cout << mapStudent[nIndex] << endl;
    }
    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

5. 数据的查找(包括判定这个关键字是否在map中出现)

在这里我们将体会,map在数据插入时保证有序的好处。

要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的map基本用法。

这里给出三种数据查找方法

第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了

第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器,程序说明

#include    <map>
#include    <stdlib.h>
#include    <iostream>
#include    <string>
using namespace std;


    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent;
    map<int, string>::iterator iter;

    mapStudent.insert (pair<int, string> (1, "one"));
    mapStudent.insert (pair<int, string> (2, "two"));
    mapStudent.insert (pair<int, string> (3, "three"));
    iter = mapStudent.find(1);
    if (iter != mapStudent.end())
    {
        cout << "Found, the value is " << iter->second << endl;
    }
    else
    {
        cout << "Not found" << endl;
    }
    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

第三种:这个方法用来判定数据是否出现,是显得笨了点,但是,我打算在这里讲解

Lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)

Upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)

例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,而upper-bound(2)的话,返回的就是3

Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字,程序说明

#include    <map>
#include    <stdlib.h>
#include    <string>
#include    <iostream>
using namespace std;


    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent;
    map<int, string>::iterator iter;

    mapStudent[1] = "one";
    mapStudent[3] = "three";
    mapStudent[5] = "five";
    iter = mapStudent.lower_bound(2);
    {
        //返回的是下界3的迭代器
        cout<<iter->second<<endl;
    }
    iter = mapStudent.lower_bound(3);
    {
        //返回的是下界3的迭代器
        cout<<iter->second<<endl;
    }
    iter = mapStudent.upper_bound(2);
    {
        //返回的是上界3的迭代器
        cout<<iter->second<<endl;
    }
    iter = mapStudent.upper_bound(3);
    {
        //返回的是上界5的迭代器
        cout<<iter->second<<endl;
    }
    pair<map<int, string>::iterator, map<int, string>::iterator> mapPair;
    mapPair = mapStudent.equal_range(2);
    if(mapPair.first == mapPair.second)
    {
        cout<<"Not found"<<endl;
    }
    else
    {
        cout<<"Found"<<endl;
    }
    mapPair = mapStudent.equal_range(3);
    if(mapPair.first == mapPair.second)
    {
        cout<<"Not found"<<endl;
    }
    else
    {
        cout<<"Found"<<endl;
    }
    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

6. 数据的清空与判空和删除

清空map中的数据可以用clear()函数,判定map中是否有数据可以用empty()函数,它返回true则说明是空map

删除要用到erase函数,它有三个重载了的函数,下面在例子中详细说明它们的用法

#include    <map>
#include    <string>
#include    <iostream>
#include    <stdlib.h>
using namespace std;


void display (map<int, string>& m);
    int
main ( int argc, char *argv[] )
{
    map<int, string> mapStudent, mapBack;
    map<int, string>::iterator iter;
    bool isEmpty;
    int n = 0; 

    mapStudent.insert (pair<int, string> (1, "one"));
    mapStudent.insert (pair<int, string> (2, "two"));
    mapStudent.insert (pair<int, string> (3, "three"));

    mapBack = mapStudent;

    cout << "Display mapStudent" << endl;
    display (mapStudent);
    isEmpty = mapStudent.empty();
    if (isEmpty)
    {
        cout << "mapStudent is empty" << endl;
    }
    else
    {
        cout << "mapStudent is not empty" << endl;
    }
    

    cout << "\nAfter clear mapStudent" << endl;
    mapStudent.clear();
    isEmpty = mapStudent.empty();
    if (isEmpty)
    {
        cout << "mapStudent is empty" << endl;
    }
    else
    {
        cout << "mapStudent is not empty" << endl;
    }

    cout << "\nDisplay mapBack" << endl;
    display (mapBack);

    n = mapBack.erase(2); /* 如果删除成功会返回1,否则返回0 */
    if (1 == n)
    {
        cout << "erase suceess!" << endl;
    }
    cout << "After earse(2)" << endl;
    display (mapBack);
    
    cout << "After earse from begin to end" << endl;
    mapBack.erase (mapBack.begin(), mapBack.end());

    isEmpty = mapBack.empty();
    if (isEmpty)
    {
        cout << "mapBack is empty" << endl;
    }
    else
    {
        cout << "mapBack is not empty" << endl;
    }

    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */



    void
display ( map<int, string>& m )
{
    map<int, string>::iterator iter = m.begin();
    
    for (; iter != m.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
    cout << endl;
}        /* -----  end of function display  ----- */

 

7. 其他一些函数用法

这里有swap,key_comp,value_comp,get_allocator等函数,感觉到这些函数在编程用的不是很多,略过不表,有兴趣的话可以自个研究

 

8. 排序

这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题

第一种:小于号重载,程序举例

#include    <map>
#include    <string>
#include    <iostream>
#include    <stdlib.h>
using namespace std;

typedef struct tagStudentInfo
{
    int nID;
    string strName;

    bool operator < (tagStudentInfo const & _A) const
    {
        //这个函数指定排序策略,按nID排序,如果nID相等,则按strName排序
        if (nID < _A.nID)
            return true;
        if (nID == _A.nID) 
            return strName.compare (_A.strName) < 0;
        return false;
    }
}StudentInfo, *PStudentInfo;                    /* 学生信息 */



    int
main ( int argc, char *argv[] )
{
    //用学生信息映射分数
    map<StudentInfo, int>mapStudent;
    map<StudentInfo, int>::iterator iter;
    StudentInfo studentInfo;

    studentInfo.nID = 1;
    studentInfo.strName = "student_one";
    mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
    studentInfo.nID = 2;
    studentInfo.strName = "student_two";
    mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));
    for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
        cout << iter->first.nID << endl << iter->first.strName
        << endl << iter->second << endl;
    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

第二种:仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明

#include    <stdlib.h>
#include    <string>
#include    <iostream>
#include    <map>
using namespace std;

typedef struct tagStudentInfo
{
    int nID;
    string strName;
}StudentInfo, *PStudentInfo;                    /* 学生信息 */


/*
 * =====================================================================================
 *        Class:  sort
 *  Description:  sort
 * =====================================================================================
 */
class sort
{
    public:
        bool operator () (StudentInfo const &_A, StudentInfo const &_B) const
        {
            if (_A.nID < _B.nID) 
                return true;
            if (_A.nID == _B.nID)
                return _A.strName.compare (_B.strName) < 0;
            return false;
        }
};


    int
main ( int argc, char *argv[] )
{
    //用学生信息映射分数
    map<StudentInfo, int, sort>mapStudent;
    map<StudentInfo, int, sort>::iterator iter;
    StudentInfo studentInfo;
    
    studentInfo.nID = 1;
    studentInfo.strName = "student_one";
    mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
    studentInfo.nID = 2;
    studentInfo.strName = "student_two";
    mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));


    for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
        cout << iter->first.strName << " " << iter->second << endl;
    }
    return EXIT_SUCCESS;
}                /* ----------  end of function main  ---------- */

 

 

醒目:本文根据原文:http://ericwang.github.com/c_cpp/2009/12/30/cpp-map.html整理,如有问题请看原文

转载于:https://www.cnblogs.com/Leo-Forest/archive/2012/06/06/2538156.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!