STL的map常用操作

STL的map常用操作

  1. map中的构造函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    map(); // 默认构造函数
    map(const map& m) // 拷贝构造函数
    map(iterator begin, iterator end ); //区间构造函数
    map(iterator begin, iterator end, const traits& _compare) //带比较谓词的构造函数
    map(iterator begin, iterator end, const traits& _compare, const allocator& all) //带分配器
  2. 数据的插入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;
    int main()
    {
    map<int, string> mapStudent;
    mapStudent.insert(pair<int, string>(1, "student_one"));
    mapStudent.insert(pair<int, string>(2, "student_two"));
    mapStudent.insert(pair<int, string>(3, "student_three"));
    map<int, string>::iterator iter;
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
    {
    cout<<iter->first<<” ”<<iter->second<<end;
    }
    }

第二种插入value_type数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
Map<int, string> mapStudent;
mapStudent.insert(map<int, string>::value_type (1, "student_one"));
mapStudent.insert(map<int, string>::value_type (2, "student_two"));
mapStudent.insert(map<int, string>::value_type (3, "student_three"));
map<int, string>::iterator iter;
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
cout<<iter->first<<” ”<<iter->second<<end;
}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
Map<int, string> mapStudent;
mapStudent[1] = “student_one”;
mapStudent[2] = “student_two”;
mapStudent[3] = “student_three”;
map<int, string>::iterator iter;
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
cout<<iter->first<<” ”<<iter->second<<end;
}
}

我们可以用pair来获得是否插入成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <map>
#include <string>
#include <iostream>
Using namespace std;
Int main()
{
Map<int, string> mapStudent;
Pair<map<int, string>::iterator, bool> Insert_Pair;
Insert_Pair=mapStudent.insert(pair<int, string>(1, “student_one”));
If(Insert_Pair.second == true)
{
Cout<<”Insert Successfully”<<endl;
}
Else
{
Cout<<”Insert Failure”<<endl;
}
Insert_Pair=mapStudent.insert(pair<int, string>(1, “student_two”));
If(Insert_Pair.second == true)
{
Cout<<”Insert Successfully”<<endl;
}
Else
{
Cout<<”Insert Failure”<<endl;
}
map<int, string>::iterator iter;
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
Cout<<iter->first<<” ”<<iter->second<<end;
}
}

  1. 数据的查找(包括判定这个关键字是否在map中出现)
    在这里我们将体会,map在数据插入时保证有序的好处。
    要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的
    map基本用法。
    这里给出两种数据查找方法
    第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系
    ,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
    第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,
    如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器,程序说明

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;
    int main()
    {
    map<int, string> mapStudent;
    mapStudent.insert(pair<int, string>(1, “student_one”));
    mapStudent.insert(pair<int, string>(2, “student_two”));
    mapStudent.insert(pair<int, string>(3, “student_three”));
    map<int, string>::iterator iter;
    iter = mapStudent.find(1);
    if(iter != mapStudent.end())
    {
    Cout<<”Find, the value is ”<<iter->second<<endl;
    }
    else
    {
    Cout<<”Do not Find”<<endl;
    }
    }
  2. 数据的删除

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <map>
#include <string>
#include <iostream>
Using namespace std;
Int main()
{
Map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(1, “student_one”));
mapStudent.insert(pair<int, string>(2, “student_two”));
mapStudent.insert(pair<int, string>(3, “student_three”));
//如果你要演示输出效果,请选择以下的一种,你看到的效果会比较好
//如果要删除1,用迭代器删除
map<int, string>::iterator iter;
iter = mapStudent.find(1);
mapStudent.erase(iter);
//如果要删除1,用关键字删除
Int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0
//用迭代器,成片的删除
//一下代码把整个map清空
mapStudent.earse(mapStudent.begin(), mapStudent.end());
//成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合
//自个加上遍历代码,打印输出吧
}

  1. 排序
    这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,以上代码在排序上是不存在任
    何问题的,因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及
    到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去。
    第一种:小于号重载,程序举例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <map>
    #include <string>
    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 nSize;
    //用学生信息映射分数
    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;
    }