Rel*_*lla 5 c++ boost stl map subtraction
所以我有2 std::maps <string, shared_ptr<file> >一个'旧'一个是'新'我想得到什么文件被删除,所以能够迭代thrue differene并做一些东西到shared_ptr.这样的事情有可能吗?怎么做?
虽然很容易自己编写(迭代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; }
);
}
Run Code Online (Sandbox Code Playgroud)
如果你想自己写这个,你应该考虑利用这两个范围已经排序的事实,所以你可以通过并行推进两个迭代器来做得比平面搜索更好.
如果你没有C++ 11,只需使用这个谓词而不是lambda:
bool my_comp(const my_map::value_type & a, const my_map::value_type & b)
{
return a.first < b.first;
}
Run Code Online (Sandbox Code Playgroud)
请注意,映射类型没有比较!因此,如果两个映射中都有相同的字符串键,那么即使两个映射值不同,结果中也不会有这样的项.如果这是不合需要的,则需要一个不同的输出容器(例如a std::multimap<my_map::key_type, my_map::mapped_type>)和不同的谓词.
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |