嵌套地图是正常实践还是非常糟糕的做法?(涉及IT技术)

3

将多个地图嵌套多层是常规做法还是非常糟糕的做法?

        // name property     // name singal         // interval of Ranges      // values

typedef std::map<std::string, std::map<std::string, std::map<RangeSignalValue, std::string > > > sgHashSignals;

2
这没什么问题,但是再加几个typedef可能会更容易阅读。 - Mike Seymour
4个回答

10

我肯定已经做过这个。不过,我会将定义分解成易于理解的部分:

typedef std::map<RangeSignalValue, std::string> RangeIntervalMap; 
typedef std::map<std::string, RangeIntervalMap> NameSignalMap;
typedef std::map<std::string, NameSignalMap>    NamePropertyMap;

1
+1 因为我还在努力记住语法时,你已经把“typedef”写出来了! ;) - FrustratedWithFormsDesigner

2
如果在您工作的上下文中有意义,那么我认为没有任何问题,除了可能难以阅读。是否可能使用typedef使一些嵌套映射更容易理解?

1
例如:
typedef std::map<RangeSignalValue, std::string> RangesValues;

typedef std::map<std::string, std::map<std::string, RangesValues > > sgHashSignals;

0

最大的问题是查找速度比替代方案稍慢:

           // property+signal, concatenated // interval of Ranges    // values

typedef std::map<std::string, std::map<RangeSignalValue, std::string > > sgHashSignals;

如何连接这两个字符串取决于它们的语法。

这将用一个字符串查找替换两个字符串查找。缺点是它需要更多的内存。


你确定吗?使用字符串键在地图中查找需要进行字符串比较。如果这些字符串具有共同的前缀,则查找将始终需要迭代至少前缀的字符。这是O(N),而地图查找是O(log N)。我会说这取决于你拥有的数据。 - sbi
3
你的建议是否更快远未确定,这取决于许多因素(包括实现方式)。我会选择最自然的解决方案(可能是嵌套映射),如果性能存在问题,则进行实验比较。 - James Kanze
@sbi 更不用说为每个第二个键的实例复制第一个键可能会使用更多的内存。而且可能会破坏局部性。 - James Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接