使用两个对象作为 unordered_map 或替代品的哈希键

Using two objects as hash key for an unordered_map or alternatives(使用两个对象作为 unordered_map 或替代品的哈希键)

本文介绍了使用两个对象作为 unordered_map 或替代品的哈希键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在定义了对象 myType 之后,我需要存储这些对象之间的关系.这些关系存储在一个矩阵中.

元素的数量事先知道,并非所有元素都有关系(element1可以与element3有关系,但可能没有与5的关系)并且内存是一个问题.例如它可能看起来像:

element45 与:

  • 具有特征 [3,1;1,4] 的 element3
  • 具有特征 [1,1;1,1] 的元素 12
  • element1780 具有特征 [8,1;1,4]

element1661 与:

  • 具有特征 [3,1;6,4] 的 element3
  • 具有特征 [1,1;1,9] 的元素 1
  • element1780 具有特征 [8,1;1,1]

有:

myType* element1;myType* element2;

我想要类似的东西(正确指出元素):

my_table[element1][element2][1][2]=7;

我想过使用 boost 库创建一个嵌套的哈希表:

boost::unordered_map>>>我的表;

然而,即使代码编译通过,它也会崩溃(分段错误,它指向一条计算哈希键的行)运行如下简单的行:

my_table[element1][element2].resize(2);for(int t=0; t<2; ++t)my_table[element1][element2][t].resize(2);

任何人都可以给我一些关于这个的信息吗?这实际上或概念上是错误的吗?

欢迎使用任何其他方法来解决此问题.

谢谢

解决方案

马上就对我来说很明显你的数据结构代表了一个图(用属性顶点和边连接它们).

<块引用>

此外,当您说这些关系存储在矩阵中."时,您显然是指我将其可视化为矩阵",因为真正的矩阵表示¹对于更大的数字会变得非常低效顶点和稀疏边缘覆盖.

Boost 有一个库:

并将其过滤为:

完整代码

生活在 Coliru

//http://stackoverflow.com/questions/32279268/using-two-objects-as-hash-key-for-an-unordered-map-or-alternatives#include <cassert>#include 模板 结构基本框{struct Point { T x, y;};点 tl, br;朋友 std::ostream&运算符<<(std::ostream& os, Point const& p) { return os <<p.x<<','<<p.y;}朋友 std::ostream&运算符<<(std::ostream& os, BasicBox const& b) { return os <<'[' <<b.tl<<';'<<b.br<<']';}朋友 std::istream&运算符>>(std::istream&is,Point&p){字符逗号;if (!(is >> p.x >> 逗号 >> p.y) && (comma == ',')) {is.setstate(std::ios::failbit | is.rdstate());}回报是;}朋友 std::istream&运算符>>(std::istream&is, BasicBox& b) {字符 lbrace, 半, rbrace;如果 (!((是 >> lbrace >> b.tl >> semi >> b.br >> rbrace) &&(lbrace == '[' && semi == ';' && rbrace == ']'))){is.setstate(std::ios::failbit | is.rdstate());}回报是;}};使用 Box = BasicBox;#include #include #include 结构顶点{std::string node_id;};结构边{盒子盒子;};使用 Graph = boost::adjacency_list;#include <fstream>#include 结构过滤器{图 const* _g;bool operator()(Graph::vertex_descriptor v) const {返回 boost::size(boost::adjacent_vertices(v, *_g))>0;}模板 bool operator()(T&&) const { return true;/* 一网打尽*

本文标题为:使用两个对象作为 unordered_map 或替代品的哈希键

基础教程推荐