STL之 map

map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。map内部通过自建一颗红黑树进行数据组织的,这颗树具有对数据自动排序的功能,即map内部所有的数据都是有序的。

1.map的构造

map共提供了6个构造函数,常用构造方式如下:

map<int, string> mp;  

2.数据插入

<1>用insert函数插入pair数据

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,string> mp;
    map<int, string>::iterator  iter;
    mp.insert(pair<int, string>(1, "value_1"));
    mp.insert(pair<int, string>(2, "value_2"));
    mp.insert(pair<int, string>(3, "value_3"));
    for(iter = mp.begin(); iter != mp.end(); iter++)
    {
        cout<<iter->first<<"  "<<iter->second<<endl;
    }
    return 0;
}

<2>用insert函数插入value_type数据

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,string> mp;
    map<int, string>::iterator  iter;
    mp.insert(pair<int, string>(1, "value_1"));
    mp.insert(map<int, string>::value_type(2, "value_2"));
    mp.insert(map<int, string>::value_type(3, "value_3"));
    for(iter = mp.begin(); iter != mp.end(); iter++)
    {
        cout<<iter->first<<"  "<<iter->second<<endl;
    }
    return 0;
}

<3>数组方式插入数据

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,string> mp;
    map<int, string>::iterator  iter;
    mp.insert(pair<int, string>(1, "value_1"));
    mp.insert(map<int, string>::value_type(2, "value_2"));
    mp[3]="value_3";
    mp[4]="value_4";
    for(iter = mp.begin(); iter != mp.end(); iter++)
    {
        cout<<iter->first<<"  "<<iter->second<<endl;
    }
    return 0;
}

以上三种用法的区别在于:当map中有这个关键字时,insert操作是插入不了数据的,但用数组方式可以通过覆盖以前该关键字对应的值进行插入。

3.map的遍历

<1>前向迭代器遍历,如上程序所示。

<2>反相迭代器遍历,如下程序所示。

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,string> mp;
    map<int, string>::reverse_iterator  iter;
    mp.insert(pair<int, string>(1, "value_1"));
    mp.insert(map<int, string>::value_type(2, "value_2"));
    mp[3]="value_3";
    mp[4]="value_4";
    for(iter = mp.rbegin(); iter != mp.rend(); iter++)
    {
        cout<<iter->first<<"  "<<iter->second<<endl;
    }
    return 0;
}

运行结果:
4 value_4
3 value_3
2 value_2
1 value_1

<3>数组方式遍历

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,string> mp;
    //map<int, string>::reverse_iterator  iter;
    mp.insert(pair<int, string>(1, "value_1"));
    mp.insert(map<int, string>::value_type(2, "value_2"));
    mp[3]="value_3";
    mp[4]="value_4";
    //for(iter = mp.rbegin(); iter != mp.rend(); iter++)
    int mpSize = mp.size();
    for(int i=1;i<=mpSize;i++)
    {
        //cout<<iter->first<<"  "<<iter->second<<endl;
        cout<<mp[i]<<endl;
    }
    return 0;
}

运行结果:
value_1
value_2
value_3
value_4

4.数据的查找

<1>count函数判定关键字是否出现

count函数返回值只有两个:0或1,0表示关键字未出现,1表示出现。该方法无法定位关键字的位置。

<2>find函数来定位关键值出现位置

find函数返回一迭代器,关键值出现,返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,string> mp;
    map<int, string>::iterator  iter;
    mp.insert(pair<int, string>(1, "value_1"));
    mp.insert(pair<int, string>(2, "value_2"));
    mp.insert(pair<int, string>(3, "value_3"));
    iter =mp.find(2);
    if(iter != mp.end())
        cout<<"the value is: "<<iter->second<<endl;
    else
        cout<<"Not find!"<<endl;
    return 0;
}

5.数据的删除

数据的删除操作通过erase函数实现。

<1>通过迭代器删除

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,string> mp;
    map<int, string>::iterator  iter;
    mp.insert(pair<int, string>(1, "value_1"));
    mp.insert(pair<int, string>(2, "value_2"));
    mp.insert(pair<int, string>(3, "value_3"));
    iter =mp.find(2);
    if(iter != mp.end())
        mp.erase(iter);
    for(iter=mp.begin();iter!=mp.end();iter++)
        cout<<iter->first<<" "<<iter->second<<endl;
    return 0;
}

<2>通过关键字删除

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,string> mp;
    map<int, string>::iterator  iter;
    mp.insert(pair<int, string>(1, "value_1"));
    mp.insert(pair<int, string>(2, "value_2"));
    mp.insert(pair<int, string>(3, "value_3"));
    //iter =mp.find(2);
    //if(iter != mp.end())
    //    mp.erase(iter);
    mp.erase(2);
    for(iter=mp.begin();iter!=mp.end();iter++)
        cout<<iter->first<<" "<<iter->second<<endl;
    return 0;
}

通过迭代器可以成片删除数据,根据STL的特性删除区间是一个左闭右开的区间

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,string> mp;
    map<int, string>::iterator  iter;
    mp.insert(pair<int, string>(1, "value_1"));
    mp.insert(pair<int, string>(2, "value_2"));
    mp.insert(pair<int, string>(3, "value_3"));
    mp.insert(pair<int, string>(4, "value_4"));
    iter =mp.find(3);
    //if(iter != mp.end())
    //    mp.erase(iter);
    mp.erase(mp.begin(),iter);
    for(iter=mp.begin();iter!=mp.end();iter++)
        cout<<iter->first<<" "<<iter->second<<endl;
    return 0;
}

6.其他常用函数

size()函数用来返回map的大小,empty()函数用来返回map是否为空,clear()函数用来清空map。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值