c++ - 在 C++ 中执行 Map<Key, Map<Key, Set<Class>>> 是很痛苦的。有没有更好的办法?

标签 c++ dictionary set code-organization

当涉及到使用映射以分层方式组织数据时,我已经习惯了 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;

如果您在应该使用引用或指针的地方使用拷贝,或者您没有选择正确的容器,则可能会出现性能问题。例如,当 setmap 不够复杂时,则 Boost.MultiIndexBoost.Graph提供更复杂的容器。另一方面,当 mapset 大部分时间保持不可变时,然后对 vector 进行排序(而不是 map >) 或排序的 vector (而不是 set)和 std::lower_bound 可能会提供更好的性能。复制setmap比复制vector要昂贵得多。

关于c++ - 在 C++ 中执行 Map<Key, Map<Key, Set<Class>>> 是很痛苦的。有没有更好的办法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17138876/

相关文章:

c++ - 将 MFC CMap 用于 CString int 对

python - 如何获取字典中的其他值然后一个值等于

python - 检查字典字典中是否存在值并获取键?

python - Python中的10个字符组成的字符串集在RAM中的大小比预期的大10倍

c++ - 循环迭代 C++ 映射,程序崩溃

c++ - EnumDisplayDevices vs WMI Win32_DesktopMonitor,如何检测事件监视器?

python - 如何从Python中的字典创建稀疏二进制矩阵

java - 在 JRE 中使用什么算法将 ArrayList<T> 转换为 LinkedHashSet<T>

Python - 这是初始化空集矩阵的正确方法吗?

c++ - ostream_iterator for vector<vector<double>>