IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ map如何使用自定义关键字 -> 正文阅读

[C++知识库]C++ map如何使用自定义关键字

众所周知,C++中的map能存放<key,value>这样的pair类型。
当你的map中的key不是内置类型时,需要传入一个compare功能的函数进行初始化,这样才使得map能够对operator[],find(),排序等操作进行支持。具体实例如下:

?
使用场景:

假设在一个有向连接图中,每一个结点与另一个结点之间的连线可能有多条(假设有多个端口)。那如何存储这样的连接信息呢?

?
示例代码:

#include <iostream>
#include <vector>
#include <map>
using namespace std;

// 方向: from指向to
struct Direction {
    int from;
    int to;
};

// 连线: 结点之前的连接关系,一个结点有若干个端口
struct Line {
    int src;      // 起始结点
    int dst;      // 目的结点
    int src_port; // 起始端口
    int dst_port; // 目的端口
};
typedef vector<Line> Lines;

struct DirectionCmp {
    bool operator()(const Direction& a, const Direction& b) const {
        return (a.from == b.from) ? (a.to < b.to) : (a.from < b.from);
    }
};
// 两个结点之间可能有多条连线表示,用自定义map来表示所有的线关系
using MyMap = map<Direction, Lines, DirectionCmp>;

int main() {
    MyMap m;
    m[{0,2}].emplace_back(Line{1,8,0,0});
    m[{0,1}].emplace_back(Line{4,5,0,0});
    m[{0,1}].emplace_back(Line{4,6,1,0});
    m[{1,2}].emplace_back(Line{7,8,0,1});
    for (const auto& p : m) {
        printf("Direction: %d -> %d\n", p.first.from, p.first.to);
        for (const auto& l : p.second) {
            printf("%d-%d-%d-%d\n", l.src, l.dst, l.src_port, l.dst_port);
        }
        printf("\n");
    }

    return 0;
}

?
输出结果:

Direction: 0 -> 1
4-5-0-0
4-6-1-0

Direction: 0 -> 2
1-8-0-0

Direction: 1 -> 2
7-8-0-1

?
如果DirectionCmp 函数误写成这样:

struct DirectionCmp {
    bool operator()(const Direction& a, const Direction& b) const {
        return a.from < b.from;
    }
};

会有不一样输出结果:

Direction: 0 -> 2
1-8-0-0
4-5-0-0
4-6-1-0

Direction: 1 -> 2
7-8-0-1

原因很简单:DirectionCmp函数是map中key进行比较的关键,如果比较不准确,那么map中的[]find排序等操作都会受到影响,结果也会有所不同。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:17:37  更:2022-04-22 18:21:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:26:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码