擦除映射 c++ 中其他键的值中已存在的那些值

Erase those values that already exists in other key's values in map c++

本文关键字:存在 那些 映射 c++ 其他 擦除      更新时间:2023-10-16

考虑我有一个地图,其值如下所述:

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(。