c++ map/multimap容器 学习笔记

1 map的基本概念

简介:

复制代码
map中所有的元素都是pair
pair中第一个元素是key(键),第二个元素是value(值)
所有元素都会根据元素的键值自动排序。

本质:

复制代码
map/multimap 属于关联式容器,底层是用红黑树实现。

优点:

复制代码
可以根据key值快速查找数据

map 和multimap 的区别:

复制代码
map不允许key重复,而multimap允许key重复

2 map的构造和赋值

构造函数

复制代码
map<T1, T2> mapT; // 默认构造函数
map(const map &st); // 拷贝构造函数

赋值

复制代码
map& operator=(const map &st); // 重载等号操作符
cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

//  map的构造和赋值

void printMap(map<string,int> &m) {
    for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
        cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<string,int> m;
    m.insert(pair<string,int>("貂蝉",18));
    m.insert(pair<string,int>("小乔",19));
    m.insert(pair<string,int>("孙尚香",17));
    m.insert(pair<string,int>("甄姬",16));
    m.insert(pair<string,int>("西施",20));
    printMap(m);

    // 拷贝构造函数
    map<string,int> m2(m);
    printMap(m2);

    // 赋值操作
    map<string,int> m3;
    m3 = m;
    printMap(m3);

}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}

3. map 大小和交换

函数原型:

复制代码
size(); // 返回 map 中元素的个数
empty(); // 判断 map 是否为空
swap(map x); // 将 x 和当前 map 中的元素进行互换
cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

//   map 大小和交换

void printMap(map<string,int> &m) {
    for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
        cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<string,int> m;
    m.insert(pair<string,int>("貂蝉",18));
    m.insert(pair<string,int>("小乔",19));
    m.insert(pair<string,int>("孙尚香",17));
    m.insert(pair<string,int>("甄姬",16));
    m.insert(pair<string,int>("西施",20));

    cout << "map 大小:" << m.size() << endl;
    if (m.empty())
    {
        cout << "map 为空" << endl;
    }
    else{
        cout << "map 不为空" << endl;
    }

    map<string,int> m2;
    m2.insert(pair<string,int>("妲己",21));
    m2.insert(pair<string,int>("王昭君",20));
    m2.insert(pair<string,int>("杨玉环",18));

    cout << "交换前:" << endl;
    printMap(m);
    printMap(m2);

    cout << "交换后:" << endl;
    m.swap(m2);
    printMap(m);
    printMap(m2);
}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}

4.map 插入和删除

函数原型:

复制代码
inserrt(elem) // 在容器中插入元素
clear() // 删除所有元素
erase(pos) // 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end) // 删除迭代器从beg到end的所有元素
erase(key) // 删除key所指的元素
cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

//   map 插入和删除


void printMap(map<string,int> &m) {
    for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
        cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<string,int> m;
    // 第一种插入方式
    m.insert(pair<string,int>("貂蝉",18));
    // 第二种插入方式
    m.insert(make_pair("小乔",19));
    // 第三种插入方式
    m.insert(map<string,int>::value_type("孙尚香",17));
    // 第四种插入方式
    m["甄姬"] = 16;
    m.insert(pair<string,int>("西施",20));

    // []不建议插入,如果key存在,则修改value,如果key不存在,则插入pair
    // 可以用[]来访问value
    cout << m["甄姬"] << endl;
    printMap(m);

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

    m.erase("甄姬"); // 删除key为甄姬的元素
    printMap(m);

    m.erase(m.begin(),m.end()); // 删除迭代器区间[begin,end)的元素 相当于清空
    printMap(m);

    
}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}

5. map查找和统计

函数原型:

复制代码
map<T1,T2>::find(key); // 查找key,如果查到,返回该键的元素的迭代器;如果查不到,返回map.end();
map<T1,T2>::count(key); // 查找key,如果查到,返回1;如果查不到,返回0;
cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

//   map查找和统计

void printMap(map<string,int> &m) {
    for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
        cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<string,int> m;
    // 第一种插入方式
    m.insert(pair<string,int>("貂蝉",18));
    // 第二种插入方式
    m.insert(make_pair("小乔",19));
    // 第三种插入方式
    m.insert(map<string,int>::value_type("孙尚香",17));
    // 第四种插入方式
    m["甄姬"] = 16;
    m.insert(pair<string,int>("西施",20));

    map<string,int>::iterator pos = m.find("小乔");
    if(pos != m.end()) {
        cout << "找到了小乔,年龄为:" << pos->second << endl;
    }
    else {
        cout << "未找到小乔" << endl;
    }

    cout << "num  " << m.count("小乔") << endl;

    
}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}

6. map容器的排序

利用防函数可以改变排序规则

cpp 复制代码
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

// map容器的排序

class MyCompare {
public:
    bool operator()(int v1,int v2) const {
        return v1 > v2;
    }
};

void printMap(map<int,string,MyCompare> &m) {
    for(map<int,string,MyCompare>::iterator it = m.begin();it!=m.end();it++) {
        cout << "id: " << it->first << " 名字: " << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<int,string,MyCompare> m;
    m.insert(make_pair(1,"西施"));
    m.insert(make_pair(2,"貂蝉"));
    m.insert(make_pair(3,"王昭君"));
    m.insert(make_pair(4,"杨玉环"));
    m.insert(make_pair(5,"杨贵妃"));
    printMap(m);
    
}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}
相关推荐
小淮AI4 小时前
从“刷题”到“追问”:AI课堂正在重塑哪些学习旧习惯?
人工智能·学习
wixzjsh5 小时前
TCP通信与HTTP协议学习笔记:粘包、三次握手、四次挥手与C/S、B/S模型
学习·tcp/ip·http
ZhiMuZhiLing5 小时前
拓客软件学习成本实测方法论:从注册到出第一批名单要多久
学习·流量运营·用户运营
程序员大雄学编程6 小时前
微积分46. 无穷级数四大核心性质:从理论到实践的全方位解析
python·学习·微积分·学习工具
LuminousCPP7 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
指针常量8 小时前
【RL系列文章】难样本学习等
学习·大语言模型·rl·后训练
码匠许师傅9 小时前
【设计模式精讲】14.外观模式(Facade)
c++·设计模式·uml·外观模式
wuyk5559 小时前
从零吃透Modbus通信|第7章:终极工程整合(模块化架构、双模式主机从机、RTOS适配、量产级模板)
c语言·stm32·学习·架构
一条破秋裤10 小时前
STM32 学习笔记:PWM 驱动 LED 呼吸灯与舵机代码
笔记·stm32·学习
xxwxx__10 小时前
C++ list 深度解析:从使用原理到模拟实现
开发语言·c++·list