嵌套地图的几个级别是正常的做法还是非常糟糕的?嵌套地图是否正常或非常糟糕?
// name property // name singal // interval of Ranges // values
typedef std::map<std::string, std::map<std::string, std::map<RangeSignalValue, std::string > > > sgHashSignals;
嵌套地图的几个级别是正常的做法还是非常糟糕的?嵌套地图是否正常或非常糟糕?
// name property // name singal // interval of Ranges // values
typedef std::map<std::string, std::map<std::string, std::map<RangeSignalValue, std::string > > > sgHashSignals;
我已经这样做了。不过,我会打破定义成了不容易消化的块状:
typedef std::map<RangeSignalValue, std::string> RangeIntervalMap;
typedef std::map<std::string, RangeIntervalMap> NameSignalMap;
typedef std::map<std::string, NameSignalMap> NamePropertyMap;
+1,用于实际写出'typedef's,而我仍然试图记住语法! ;) – FrustratedWithFormsDesigner 2011-03-30 17:34:53
如果它在上下文中有意义,那么我看不到任何问题,除非它可能很难阅读。可能使用typedef
来使这些嵌套地图中的一些更易于理解?
谢谢你的好主意 – 2011-03-30 17:23:19
最大的问题是,查找是比选择稍微慢一点:
// property+signal, concatenated // interval of Ranges // values
typedef std::map<std::string, std::map<RangeSignalValue, std::string > > sgHashSignals;
正是你应该如何连接第一两个字符串取决于尽管如此,他们的语法。
这将用一个替换两个字符串查找。缺点是需要更多的内存。
你确定吗?在带有字符串键的地图中查找需要字符串比较。如果这些字符串具有相同的前缀,那么查找将不得不总是至少迭代前缀的字符。这是O(N),而地图查找是O(log N)。我会说这取决于你所拥有的数据。 – sbi 2011-03-30 17:31:30
由于你的建议更快,这远非如此。这取决于很多因素(包括执行情况) 。我会用最自然的 解决方案(这可能是嵌套地图),并试验如果我有 性能问题。 – 2011-03-30 17:36:46
@sbi更不用说为第二个键的每个实例复制第一个键都可以使用更多的内存。也许破坏当地。 – 2011-03-30 17:38:06
例如:
typedef std::map<RangeSignalValue, std::string> RangesValues;
typedef std::map<std::string, std::map<std::string, RangesValues > > sgHashSignals;
没有错,但多了一些类型定义可能更容易阅读。 – 2011-03-30 17:23:12