Using two objects as hash key for an unordered_map or alternatives(使用两个对象作为 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 或替代品的哈希键
基础教程推荐
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 从 std::cin 读取密码 2021-01-01