【问题标题】:How to subtract one list of map keys from another and get new map (map A - mab B = map C)如何从另一个映射键列表中减去一个映射键列表并获得新映射(映射 A - mab B = 映射 C)
【发布时间】:2011-12-04 03:07:58
【问题描述】:

所以我有 2 个 std::maps <string, shared_ptr<file> > 一个是“旧的”一个是“新的”我想获取删除了哪些文件,以便能够通过差异进行迭代并对 shared_ptr 做一些事情。这样的事情可能吗?怎么做?

【问题讨论】:

  • 看看std::set_difference。

标签: c++ boost stl map subtraction


【解决方案1】:

虽然自己编写这个很容易(遍历A 并检查密钥是否存在于B 中),这看起来像是std::set_difference 的工作。不过,我们需要一个 lambda 或一些自定义谓词来比较键:

#include <iterator>
#include <map>
#include <string>
#include <algorithm>

typedef std::map<std::string, MyPtr> my_map;

my_map A; // given
my_map B; // given

void make_a_difference()
{
  my_map C; // will hold the result

  std::set_difference(A.begin(), A.end(),
                      B.begin(), B.end(),
                      std::insert_iterator<my_map>(C, C.end()),
              [](const my_map::value_type & a, const my_map::value_type & b)
              { return a.first < b.first; }
                     );
}

如果您想自己编写此代码,则应考虑利用两个范围都已排序的事实,因此您可以比通过并行推进两个迭代器进行的平面搜索更好。

如果您没有 C++11,只需使用此谓词而不是 lambda:

bool my_comp(const my_map::value_type & a, const my_map::value_type & b)
{
  return a.first < b.first;
}

注意映射类型没有比较!因此,如果您在两个映射中具有相同的字符串键,那么即使两个映射值不同,结果中也不会有这样的项目。如果这是不可取的,您需要一个不同的输出容器(例如 std::multimap&lt;my_map::key_type, my_map::mapped_type&gt;)和一个不同的谓词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 2021-09-21
    • 1970-01-01
    • 2012-10-16
    • 2017-07-24
    • 2012-11-23
    相关资源
    最近更新 更多