如何从一个映射键列表中减去另一个映射键列表并获取新映射(映射 A - mab B = 映射 C)

发布于 2024-12-08 17:00:17 字数 164 浏览 4 评论 0 原文

所以我有 2 个 std::maps ; > 一个是“旧”,一个是“新”我想获取哪些文件被删除,这样就能够迭代差异并对shared_ptr 做一些事情。这样的事情可能吗?如何做到?

So I have 2 std::maps <string, shared_ptr<file> > one is 'old' one is 'new' I want to get what files were removed and so be capable to iterate thrue differene and do some stuff to shared_ptr. Is such thing possible and how to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

诗酒趁年少 2024-12-15 17:00:18

虽然自己编写这个代码很容易(迭代 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)和不同的谓词。

While it's easy enough to write this yourself (iterate over A and check if the key is present in B), this looks like a job for std::set_difference. We'll need a lambda or some custom predicate to compare keys, though:

#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; }
                     );
}

If you want to write this yourself, you should consider taking advantage of the fact that both ranges are already sorted, so you can do better than a flat search for existence by advancing two iterators in parallel.

If you don't have C++11, just use this predicate instead of the lambda:

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

Beware that there is no comparison on the mapped type! So if you have the same string key in both maps, then there will be no such item in the result, even if the two mapped values differ. If this is undesirable, you need a different output container (e.g. a std::multimap<my_map::key_type, my_map::mapped_type>) and a different predicate.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文