众所周知,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 、排序 等操作都会受到影响,结果也会有所不同。
|