当涉及到使用映射以分层方式组织数据时,我已经习惯了 Python 的开发思维。它很简单,语法上也很便宜。虽然在 C++ 中并不是非常困难,但嵌套映射/集使组织变得困难。我认为我没有正确思考这个问题。
作为示例,我使用以下组织:
typedef set<Motif> Motifs;
typedef map<Motif, Motifs> LinkedMotifs;
struct Candidates {
Motifs deadend;
Motifs intralinked;
LinkedMotifs interlinked;
};
typedef map<Linker::shp, Candidates> LinkedCandidates;
出于性能原因,我使用 boost 的 flat_map/set 实现。 Motif 是一个 std::结构对。 Linker::shp 是一个 SharedPtr。
该 map 是搜索功能的结果。搜索完成后,我对结果进行评分,并在一个单独的函数中将结果写入文件。我在设计该项目时考虑到了函数式编程,我最初的尝试是将候选结构和分数结构分开。然而,这产生了问题,因为我基本上最终在内存中重新创建了所有 map 结构。当所有内容都写入磁盘时,结构很重要。
我可以将分数链接到 map 和集合中的迭代器,但老实说,我似乎让事情变得太困难了。
谢谢!
*进行编辑以使我的最终目标更有意义。
最佳答案
请注意,代码的大部分冗长来自于在所有名称中重复使用“序列和配置对”。这表明您需要一个术语来解决这个问题。最好是使用问题域俚语中使用的相同术语来命名。人类是懒惰的。假设他们将其称为motif
,一切都变得更加简单:
typedef set<Motif> Motifs;
typedef map<Motif, Motifs> LinkedMotifs;
struct Candidates {
Motifs deadend;
Motifs intralinked;
LinkedMotifs interlinked;
};
typedef map<Linker::shp, Candidates> LinkersCandidates;
IOW ...使用短名称。始终将每个名称放入 C++ 中的命名空间中。 C++通常用于 编写相当大的产品(平均数百万行),这有助于 避免名称冲突。
如果您需要重用该组织,则可以使用模板:
template<typename T>
struct Handler {
typedef set<T> Ts;
typedef map<T, Ts> LinkedTs;
struct Candidates {
Ts deadend;
Ts intralinked;
LinkedTs interlinked;
};
typedef map<Linker::shp, Candidates> LinkersCandidates;
};
typedef Handler<Motif>::LinkersCandidates LinkersMotifCandidates;
typedef Handler<Other>::LinkersCandidates LinkersOtherCandidates;
如果您在应该使用引用或指针的地方使用拷贝,或者您没有选择正确的容器,则可能会出现性能问题。例如,当 set
和 map
不够复杂时,则 Boost.MultiIndex或Boost.Graph提供更复杂的容器。另一方面,当 map
或 set
大部分时间保持不可变时,然后对 vector
进行排序(而不是 map
>) 或排序的 vector
(而不是 set
)和 std::lower_bound
可能会提供更好的性能。复制set
和map
比复制vector
要昂贵得多。
关于c++ - 在 C++ 中执行 Map<Key, Map<Key, Set<Class>>> 是很痛苦的。有没有更好的办法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17138876/