C++ 删除其他键';图c+中的s值+;

C++ 删除其他键';图c+中的s值+;,c++,c++11,stl,stdmap,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 据我所知,在地图中按值搜索并不容易。对于我的代码,按值搜索是不可行的,因为我的数据非常大。这将非常耗时 有没有更好的方法可以做到这一点,而不必通过以下每个键中的每个值来删除公共值 std::set<int>

假设我有一张地图,上面的值如下所述:

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
据我所知,在地图中按值搜索并不容易。对于我的代码,按值搜索是不可行的,因为我的数据非常大。这将非常耗时

有没有更好的方法可以做到这一点,而不必通过以下每个键中的每个值来删除公共值

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);
}
这使得向后迭代容器变得快速而简单

这是O(nlgn),而您的解决方案是O(n^2lgn)

这使得向后迭代容器变得快速而简单


这是O(nlgn),而您的解决方案是O(n^2lgn)。

它们是如何进入映射的?这些值实际上是应用程序中每个循环的基本块。我从一个辅助工具得到它。插入时不可能进行检查,因为我使用的是另一个工具提供的数据。在不实际检查这些键的情况下,您打算如何找出任何键中是否存在x?根据物理定律,这根本不可能。如果你愿意的话,你可以通过在第二个容器中创建一种索引来加快速度,如果创建所述索引的额外内存/时间成本值得的话——如果你只做一次,那就不太可能了。在使用数据的过程中,动态地做这件事可能会更容易,但如果你不知道要做什么,就不可能说出来。它们是如何进入映射的?这些值实际上是我在应用程序中拥有的每个循环的基本块。我从一个辅助工具得到它。插入时不可能进行检查,因为我使用的是另一个工具提供的数据。在不实际检查这些键的情况下,您打算如何找出任何键中是否存在x?根据物理定律,这根本不可能。如果你愿意的话,你可以通过在第二个容器中创建一种索引来加快速度,如果创建所述索引的额外内存/时间成本值得的话——如果你只做一次,那就不太可能了。在使用数据的过程中,动态地做这件事可能会更容易,但如果你不知道要做什么,就不可能说出来。一个小男孩会有帮助的。
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);
}
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()};
}