所以我有 2 个std::map
,<string, shared_ptr<file> >
一个是“旧的”,一个是“新的”,我想获取已删除的文件,以便能够通过差异进行迭代并对 shared_ptr 做一些事情。这样的事情可能吗?怎么做?
问问题
1443 次
1 回答
9
虽然自己编写它很容易(迭代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;
}
请注意,映射类型没有比较!因此,如果您在两个映射中具有相同的字符串键,那么即使两个映射值不同,结果中也不会有这样的项目。如果这是不可取的,您需要一个不同的输出容器(例如 a std::multimap<my_map::key_type, my_map::mapped_type>
)和一个不同的谓词。
于 2011-10-09T21:40:27.690 回答