5
所以我有2 std::map
s <string, shared_ptr<file> >
一个是'旧'一个是'新'我想要得到什么文件被删除,所以能够迭代thrue不同,并做一些东西到shared_ptr。这样的事情是可能的吗?怎么做?如何从另一个减去一个地图键列表并获取新地图(地图A - mab B =地图C)
所以我有2 std::map
s <string, shared_ptr<file> >
一个是'旧'一个是'新'我想要得到什么文件被删除,所以能够迭代thrue不同,并做一些东西到shared_ptr。这样的事情是可能的吗?怎么做?如何从另一个减去一个地图键列表并获取新地图(地图A - mab B =地图C)
尽管您自己编写代码很容易(重复执行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,只是使用的,而不是拉姆达这个谓词:
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>
)和一个不同的谓词。
看看'''std :: set_difference'''。 –