清除地图c ++中其他键的值中已经存在的那些值

时间:2018-09-11 16:41:46

标签: c++ c++11 stl stdmap

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

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中的值进行搜索并不是那么容易。对于我的代码,由于值非常大,因此按值搜索是不可行的。这将很耗时。

有没有一种更好的方法,而不必遍历以下每个键中的每个值以删除公共值?

1 个答案:

答案 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)。