gpt4 book ai didi

c++ - 如何从一个 map 键列表中减去另一个 map 键列表并获得新 map ( map A - mab B = map C)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:37 29 4
gpt4 key购买 nike

所以我有 2 std::map s <string, shared_ptr<file> >一个是“旧的”,一个是“新的”,我想知道哪些文件被删除了,这样就能够遍历差异并对 shared_ptr 做一些事情。这样的事情可能吗?如何做到?

最佳答案

虽然自己写这个很容易(遍历 A 并检查 key 是否存在于 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<my_map::key_type, my_map::mapped_type>)和一个不同的谓词。

关于c++ - 如何从一个 map 键列表中减去另一个 map 键列表并获得新 map ( map A - mab B = map C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706602/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com