map

1、map简介
(1)map的特性
map的所有元素都会根据元素的键值自动排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值,底层机制由红黑树实现。
(2)map的性质
当客户端对它进行元素新增操作或删除操作时,操作之前的所有迭代器,在操作完成之后都依然有效。

2、map的基本操作
使用map时,必须包含头文件以及std标准命名空间。
(1)数据的插入
1)用insert函数插入value_type数据。value_type表示元素型别(键值/实值)。

void TestMap2()
{
    map<int, string> map2;
    map2.insert(map<int, string>::value_type(1, "one"));
    map2.insert(map<int, string>::value_type(2, "two"));
    map2.insert(map<int, string>::value_type(3, "three"));
    map<int, string>::iterator iter = map2.begin();
    while (iter != map2.end())
    {
        cout << iter->first << " " << iter->second << endl;
        iter++;
    }
}

运行结果为:
在这里插入图片描述
2)用数组方式插入数据

void TestMap3()
{
    map<int, string> map3;
    map3[1] = "one";
    map3[2] = "two";
    map3[3] = "three";
    map<int, string>::iterator iter;
    for (iter = map3.begin(); iter != map3.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
}

运行结果为:
在这里插入图片描述
3)用insert函数插入pair数据

#include<iostream>
#include<stdlib.h>
#include<map>
#include<string>
 
using namespace std;
 
void TestMap1()
{
    map<int, string> map1;
    map1.insert(pair<int, string>(1, "one"));
    map1.insert(pair<int, string>(2, "two"));
    map1.insert(pair<int, string>(3, "three"));
    map1.insert(pair<int, string>(3, "four"));
    map<int, string>::iterator iter;
    for (iter = map1.begin(); iter != map1.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
}
int main()
{
    TestMap1();
    system("pause");
    return 0;
}

运行结果为:
在这里插入图片描述
用数组插入数据可覆盖原有数据

void TestMap5()
{
    map<int, string> map5;
    map5[1] = "one";
    map5[2] = "two";
    map5[3] = "three";
    map5[3] = "four";
    map<int, string>::iterator iter;
    for (iter = map5.begin(); iter != map5.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
}

运行结果为:
在这里插入图片描述
如何知道插入成功与否?以下通过pair的第二个参数来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功则第二个参数返回true,否则为false。

void TestMap4()
{
    pair<map<int, string>::iterator, bool> insert_bool;
    map<int, string> map4;
    insert_bool = map4.insert(pair<int, string>(1, "one"));
    if (insert_bool.second == true)
    {
        cout << "insert successfully" << endl;
    }
    else
    {
        cout << "insert failure" << endl;
    }
 
    insert_bool = map4.insert(pair<int, string>(1, "two"));
    if (insert_bool.second == true)
    {
        cout << "insert successfully" << endl;
    }
    else
    {
        cout << "insert failure" << endl;
    }
}

运行结果为:
在这里插入图片描述
(2)数据的遍历
1)应用前向迭代器,上面的程序中用到。
2)应用反向迭代器。

void TestMap6()
{
    map<int, string> map6;
    map6.insert(pair<int, string>(1, "one"));
    map6.insert(pair<int, string>(2, "two"));
    map6.insert(pair<int, string>(3, "three"));
    map<int, string>::reverse_iterator iter;
    for (iter = map6.rbegin(); iter != map6.rend(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
}

运行结果为:
在这里插入图片描述
3)应用数组遍历元素。

void TestMap7()
{
    map<int, string> map7;
    map7.insert(map<int, string>::value_type(1, "one"));
    map7.insert(map<int, string>::value_type(2, "two"));
    map7.insert(map<int, string>::value_type(3, "three"));
    for (int i = 1; i <= map7.size(); i++)//注意:关键值最小为1而不是0
    {
        cout << map7[i] << endl;
    }
}

运行结果为:
在这里插入图片描述
(3)数据的删除

void TestMap8()
{
    map<int, string> map8;
    map8[1] = "one";
    map8[2] = "two";
    map8[3] = "three";
    map8[4] = "four";
    map8[5] = "five";
    map8[6] = "six";
    map<int, string>::iterator iter;
    cout << "原有数据为:" << endl;
    for (iter = map8.begin(); iter != map8.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
    cout << endl;
    
    //用迭代器删除
    iter = map8.find(1);
    map8.erase(iter);
    cout << "删除关键字1后的数据为:" << endl;
    for (iter = map8.begin(); iter != map8.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;

    }
    cout << endl;

    //用关键字删除
    int n = map8.erase(1);
    cout << "删除关键字1后的数据为:" << endl;
    for (iter = map8.begin(); iter != map8.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
    cout << endl;

    //用迭代器删除区间
    map8.erase(map8.begin(), map8.end());
    cout << "删除后的数据为:" << endl;
    for (iter = map8.begin(); iter != map8.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
}

运行结果为:
在这里插入图片描述
注意:使用erase关键字删除数据,如果成功则返回1,否则返回0。
(4)clear():数据的清空。
(5)empty():数据的判空。
(6)size():获取有效元素的大小。
(7)count():获取键值中查找元素的个数。如果有返回1,否则返回0。
(8)rbegin():在反向迭代器中表示起始元素。
(9)rend():在反向迭代器中表示末尾元素。
(10)operator[key]:通过键值(key)获取该key对应的value。
(11)at(key):通过键值(key)获取该key对应的value。
(12)lower_bound(val):返回容器中第一个值【大于或等于】val的元素的iterator位置。
(13)upper_bound(val): 返回容器中第一个值【大于】。
【例】

void TestMap9()
{
    map<string, string> map9;
    map9.insert(pair<string, string>("鲁智深", "花和尚"));
    map9.insert(make_pair("史进", "九纹龙"));
    map9.insert(make_pair("公孙胜", "入云龙"));
    map9.insert(make_pair("李逵", "黑旋风"));
    map9.insert(make_pair("石秀", "拼命三郎"));
    map9.insert(make_pair("宋江", "及时雨"));
    cout << "map中元素的个数为:" << map9.size() << endl;
    cout << "map中的元素有:" << endl;
    map<string, string>::iterator iter;
    for (iter = map9.begin(); iter != map9.end(); iter++)
    {
        cout << iter->first << " " << iter->second << endl;
    }
    cout << endl;

    //修改key所对应的value
    cout << "修改key所对应的value值" << endl;
    cout << "宋江" << "--->" << map9["宋江"] << endl;
    map9["宋江"] = "宋大侠";
    cout << "宋江" << "--->" << map9["宋江"] << endl << endl;

    //通过[]访问不存在的键值对中的value值
    cout << "王伦" << "--->" << map9["王伦"] << endl;
    cout << "map中的元素的个数为:" << map9.size() << endl;
    cout << "插入键值为“王伦”的元素后,元素有:" << endl;
    map<string, string>::reverse_iterator re_iter;
    for (re_iter = map9.rbegin(); re_iter != map9.rend();re_iter++)
    {
        cout << re_iter->first << " " << re_iter->second << endl;
    }
    cout << endl;

    //删除
    map9.erase(map9.find("王伦"));
    cout << "使用erase删除,map中的元素的个数为:" << map9.size() << endl;

    //将map中的元素清空
    map9.clear();
    cout << "将map中的元素清空后,元素的个数为:" << map9.size() << endl;
}

运行结果为:
在这里插入图片描述

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值