擦除映射 c++ 中其他键的值中已存在的那些值
Erase those values that already exists in other key's values in map c++
考虑我有一个地图,其值如下所述:
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(。
相关文章:
- C++模板来检查友元函数的存在
- 既然存在危险,为什么项目要使用-I include开关
- 我们可以访问一个不存在的联盟的成员吗
- C++:对不存在的命名空间使用命名空间指令
- C++quit()函数中可能存在作用域问题
- C++擦除(如果存在)
- g++ 说函数不存在,即使包含正确的标头
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 有了gcc,是否可以链接库,但前提是它存在
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- C++Builder中的OnClick事件签名存在问题
- 如何正确地将分支添加到已存在的树中
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 如何检查QList中是否存在值
- 根据某个函数是否存在启用模板
- 如何将分支添加到已存在的TTree:ROOT
- 地图计数确实很重要,或者只是检查是否存在
- 擦除映射 c++ 中其他键的值中已存在的那些值
- Winsock2 的 listen() 函数为每个端口查找一个连接;甚至那些不存在的?