考虑我有一个带有值的地图,如下所述:
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
据我所知,按地图中的值搜索并不容易。而对于我的代码,由于我的数据非常大,因此无法按值搜索。这将是耗时的。
有没有更好的方法来执行此操作而不通过以下每个键中的每个值来删除常见值?
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)。