【问题标题】:Check if map in C++ contains all the keys from another map检查 C++ 中的地图是否包含来自另一个地图的所有键
【发布时间】:2012-09-28 07:24:11
【问题描述】:

我打算在 C++ 中使用两个映射,类型为:std::map<char, Node>,其中Node 是一个自定义类。假设我有两个映射,m1m2 以上类型,我想知道m1 是否包含m2 中存在的所有 键。也就是说,我要验证m1m2的key集合的交集与m2的key集合是否相同。

我可以遍历m2 中的所有键并在m1 上执行find()count(),但这似乎是一种浪费并且可能会很慢。我这样说是因为键在std::map 中按排序顺序存储为二叉搜索树,因此每个查找/计数都将占用 O(logn),对于m2 中的下一个键,相同的路径m1 的键必须从头开始遍历。

我是 STL 的新手,所以请原谅我对似乎应该很容易做到的事情的无知。此外,一些简单的示例代码 sn-ps 或代码 sn-ps 的链接将非常有助于更好地理解。我不能使用非标准库,包括 boost。

提前致谢!

【问题讨论】:

    标签: c++ stl map set intersection


    【解决方案1】:

    由于map 的键已排序,因此您可以同时遍历它们并相互比较键。如果key(m1) < key(m2),则增加m1的迭代器;如果 key(m2) < key(m1) 则 m2 包含一个不在 m1 中的键。

    这是 O(n)。

    【讨论】:

    • 这很好 - 类似于排序列表的合并算法。谢谢!
    • 这是 Θ(m2 + m1) 而原始算法是 Θ(m2 * log(m1)) (根据地图命名大小)。这是否更好实际上取决于m1 相对于m2 的大小...
    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多