c++STL map和multimap基本操作

map

map提供了一对一的关系
添加元素

#include <iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
    //map添加数据
        //方法一,insert()函数插入pair数据
    map<int,string>mapeg;
    mapeg.insert(pair<int,string>(1,"str1"));
    mapeg.insert(pair<int,string>(2,"str2"));
    mapeg.insert(pair<int,string>(3,"str3"));
    map<int,string>::iterator iter;
    for(iter=mapeg.begin();iter!=mapeg.end();iter++)
    {//迭代器遍历
        cout<<iter->first<<" "<<iter->second<<endl;
    }
        //方法二,insert()函数插入value_tpye数据
    map<int,string>mapeg2;
    mapeg2.insert(map<int,string>::value_type(4,"str4"));
    mapeg2.insert(map<int,string>::value_type(5,"str5"));
    mapeg2.insert(map<int,string>::value_type(6,"str6"));
    map<int,string>::iterator iter2;
    for(iter2=mapeg2.begin();iter2!=mapeg2.end();iter2++)
    {
        cout<<iter2->first<<" "<<iter2->second<<endl;
    }
        //方法三,数组方式插入数据
    map<int,string>mapeg3;
    mapeg3[7]="str7";
    mapeg3[8]="str8";
    mapeg3[9]="str9";
    map<int,string>::iterator iter3;
    for(iter3=mapeg3.begin();iter3!=mapeg3.end();iter3++)
    {
        cout<<iter3->first<<" "<<iter3->second<<endl;
    }
    return 0;
}

查找元素和删除元素

#include <iostream>
#include<map>
using namespace std;
int main()
{
    //查找元素
    	//方法一,find()函数
    /*find()函数返回一个迭代器指向键值为key的元素,
    若没有找到,则返回指向map尾部的迭代器*/
    map<int,float>a;
    a[1]=12.2;
    a[2]=12.4;
    map<int,float>::iterator it;
    it=a.find(1);
    a.erase(it);//删除元素
    /*erase()删除,可在括号里写键值,
    也可以写相应的迭代器iterator位置*/
    for(it=a.begin();it!=a.end();it++)
    {
        cout<<it->first<<" "<<it->second<<endl;
    }
    return 0;
}

排序,map中的sort问题
map中的元素是自动按Key升序排序,所以不能对map用sort函数

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

#include <iostream>
#include<map>
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<<' '<<iter->first.strName<<' '<<iter->second<<endl;

    return 0;
}
运行结果:
1 student_one 90
2 student_two 80

multimap

multimap特性及用法与map完全相同,唯一的差别在于:
multimap允许重复键值的元素插入容器(使用了insert_equal函数)
multimap没有重载operator [] 功能。
因此:键值key与元素value的映照关系是多对多的关系

添加元素

#include <iostream>
#include<map>
using namespace std;
//multimap插入与遍历
int main()
{
    multimap<int,string>a;
    multimap<int,string>::iterator it;
    a.insert(pair<int,string>(1,"str1"));
    a.insert(pair<int,string>(2,"str2"));
    a.insert(pair<int,string>(3,"str3"));
    a.insert(pair<int,string>(3,"str3"));//插入相同重复元素

    //遍历
    for(it=a.begin();it!=a.end();it++)
    {
        cout<<it->first<<" "<<it->second<<endl;
    }
    return 0;
}
运行结果
1 str1
2 str2
3 str3
3 str3

删除和查找

#include <iostream>
#include<map>
using namespace std;
//multimap删除和查找
int main()
{
    multimap<int,string>a;
    //a[1]=12.2;//error
    //a[2]=12.4;//error,multimap不能重载[]
    a.insert(pair<int,string>(1,"str1"));
    a.insert(pair<int,string>(2,"str2"));
    a.insert(pair<int,string>(3,"str3"));
    multimap<int,string>::iterator it;
    it=a.find(1);
    a.erase(it);//删除元素
    /*erase()删除,可在括号里写键值,
    也可以写相应的迭代器iterator位置*/
    for(it=a.begin();it!=a.end();it++)
    {
        cout<<it->first<<" "<<it->second<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值