c++ map和multimap

构造和赋值

/*
 * 构造和赋值
 */

/*
 * 简介:
 * map中所有元素都是pair
 * pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
 * 所有元素都会根据元素的键值自动排序
 *
 * 本质:
 * map/multimap属于关联式容器,底层是用二叉树实现
 *
 * 优点:
 * 可以根据key值快速找到value值
 *
 * map和multimap区别:
 * map不允许容器中有重复key值元素
 * multimap允许容器中有重复key值元素
 *
 */

#include <iostream>
#include <map>

void printMap(std::map<int, int> &m)
{
    for(auto elem:m)
    {
        std::cout<<"key: "<<elem.first<<" value: "<<elem.second;
    }
    std::cout<<std::endl;
}

void test01()
{
    //创建map容器
    std::map<int, int> m;

    m.insert(std::pair<int, int>(1, 10));
    m.insert(std::pair<int, int>(3, 30));
    m.insert(std::pair<int, int>(2, 20));
    m.insert(std::pair<int, int>(4, 40));

    printMap(m);

    //拷贝构造
    std::map<int, int> m2(m);
    printMap(m2);

    //赋值
    std::map<int, int> m3;
    m3 = m2;
    printMap(m3);
}

int main()
{
    test01();

    return 0;
}

大小和交换

/*
 * 大小和交换
 */

/*
 * 统计map容器大小以及交换map容器
 */

#include <iostream>
#include <map>

void printMap(std::map<int, int> &m)
{
    for(auto elem:m)
    {
        std::cout<<"key: "<<elem.first<<" value: "<<elem.second;
    }
    std::cout<<std::endl;
}

//大小
void test01()
{
    std::map<int, int> m;
    m.insert(std::pair<int, int>(1, 10));
    m.insert(std::pair<int, int>(2, 20));
    m.insert(std::pair<int, int>(3, 30));

    if(m.empty())
    {
        std::cout<<"m is empty"<<std::endl;
    }
    else
    {
        std::cout<<"m is not empty"<<std::endl;
        std::cout<<"m.size(): "<<m.size()<<std::endl;
    }
}

//交换
void test02()
{
    std::map<int, int> m;
    m.insert(std::pair<int, int>(1, 10));
    m.insert(std::pair<int, int>(2, 20));
    m.insert(std::pair<int, int>(3, 30));

    std::map<int, int> m2;
    m2.insert(std::pair<int, int>(4, 100));
    m2.insert(std::pair<int, int>(5, 200));
    m2.insert(std::pair<int, int>(6, 300));

    std::cout<<"before swap: "<<std::endl;
    printMap(m);
    printMap(m2);

    std::cout<<"after swap: "<<std::endl;
    m.swap(m2);
    printMap(m);
    printMap(m2);
}

int main()
{
//    test01();
    test02();

    return 0;
}

插入和删除

/*
 * 插入和删除
 */

/*
 * map容器进行插入数据和删除数据
 */

#include <iostream>
#include <map>

void printMap(std::map<int, int> &m)
{
    for(auto elem:m)
    {
        std::cout<<"key: "<<elem.first<<" value: "<<elem.second<<std::endl;
    }
    std::cout<<std::endl;
}

void test01()
{
    std::map<int, int> m;

    //插入
    //第一种
    m.insert(std::pair<int, int>(1, 10));

    //第二种
    m.insert((std::make_pair(2, 20)));

    //第三种(不建议)
    m.insert(std::map<int, int>::value_type(3, 30));

    //第四种
    m[4] = 40;
    //[]不建议插入,用途 可以通过key访问到value
//    std::cout<<m[5]<<std::endl;
    printMap(m);

    //删除
    m.erase(m.begin());
    printMap(m);

    m.erase(3);//按照key删除
    printMap(m);

    //清空
//    m.erase(m.begin(), m.end());
//    printMap(m);
    
    m.clear();
    printMap(m);


}

int main()
{
    test01();

    return 0;
}

查找和统计

/*
 * 查找和统计
 */

/*
 * 对map容器进行查找数据以及统计数据
 */

#include <iostream>
#include <map>

void test01()
{
    //查找
    std::map<int, int> m;
    m.insert(std::pair<int, int>(1, 10));
    m.insert(std::pair<int, int>(2, 20));
    m.insert(std::pair<int, int>(3, 30));

    auto pos = m.find(3);
    if(pos != m.end())
    {
        std::cout<<"found: "<<std::endl;
        std::cout<<"key: "<<pos->first<<" value: "<<pos->second<<std::endl;
    }
    else
    {
        std::cout<<"not found"<<std::endl;
    }

    //统计
    //map不允许插入重复key元素,count统计而言, 要么结果是0 要么是1
    //multimap的count统计可能大于1
    int num = m.count(3);
    std::cout<<"num = "<<num<<std::endl;

}

int main()
{
    test01();

    return 0;
}

map容器排序

/*
 * map容器排序
 */

/*
 * 学习目标:
 * map容器默认排序规则为 按照key值从小到达排序,掌握如何改变排序规则
 *
 * 主要技术点:
 * 利用仿函数,可以改变排序规则
 * 对于自定义数据类型,map必须要指定排序规则,同set容器
 */

#include <iostream>
#include <map>

class myCompare
{
public:
    bool operator()(int v1, int v2)
    {
        //降序
        return v1 > v2;
    }
};

void printMap(std::map<int, int, myCompare> &m)
{
    for(auto elem:m)
    {
        std::cout<<"key: "<<elem.first<<" value: "<<elem.second<<std::endl;
    }
    std::cout<<std::endl;
}

void test01()
{
    std::map<int, int, myCompare> m;
    m.insert(std::make_pair(1, 10));
    m.insert(std::make_pair(2, 20));
    m.insert(std::make_pair(5, 50));
    m.insert(std::make_pair(3, 30));
    m.insert(std::make_pair(4, 40));

    printMap(m);


}

int main()
{
    test01();

    return 0;
}
发布了39 篇原创文章 · 获赞 8 · 访问量 7934

猜你喜欢

转载自blog.csdn.net/weixin_40512640/article/details/103654189