考虑一下,我有一个具有如下所述值的地图:
std::map<int, std::set<int>> myMap;
key 0: 1,2,3,4,5,6,7,8,9,10
key 1: 1,2,3,4,5,6
key 2: 4,5,6,7
key 3: 6,7
现在,我要擦除键0中存在的所有这些值,该值存在于其后的其他键中。对于键1依此类推,依此类推。 因此,最终输出(myMap)应该如下所示:
key 0: 8,9,10
key 1: 1,2,3
key 2: 4,5
key 3: 6,7
据我所知,通过map中的值进行搜索并不是那么容易。对于我的代码,由于值非常大,因此按值搜索是不可行的。这将很耗时。
有没有一种更好的方法,而不必遍历以下每个键中的每个值以删除公共值?
答案 0 :(得分:2)
std::set<int> to_remove;
for(auto&& e:backwards(myMap)) {
std::set<int> r;
std::set_difference(
r.second.begin(), r.second.end(),
to_remove.begin(), to_remove.end(),
std::inserter(r)
);
std::copy(r.second.begin(), r.second.end(), std::inserter(to_remove));
r.second = std::move(r);
}
其中backwards
是:
template<class It>
struct range_t {
It b, e;
It begin() const { return b; }
It end() const { return e; }
};
template<class C>
auto backwards( C& c )
-> range_t< typename C::reverse_iterator >
{
return {c.rbegin(), c.rend()};
}
template<class C>
auto backwards( C const& c )
-> range_t< typename C::const_reverse_iterator >
{
return {c.rbegin(), c.rend()};
}
这使得在容器上快速便捷地进行向后迭代。
这是O(nlgn),而您的解决方案是O(n ^ 2lgn)。