是否有一种有效的方法将multiset转换为set,而不是循环multimap中的所有元素,如果set有元素则测试,如果是,则插入如果不继续?对于multiset和set,我更喜欢使用库存C ++容器,但其他语言实现也没问题。
答案 0 :(得分:2)
std::set<T> new_set(multiset_obj.begin(), multiset_obj.end();
应该做到这一点。让语言和容器要求成为你的朋友。
答案 1 :(得分:2)
您可以从现有的多重集
创建一个集template<typename T>
set<T> SetFromMultiset(multiset<T> const &ms)
{
set<T> ret(ms.cbegin(), ms.cend())
return ret;
}
我假设您正在使用c ++ 11,因此按值返回容器没有开销,只有移动操作(即使这是RVO适用的情况)
答案 2 :(得分:0)
我不确定上述答案是否最有效。
multiset中的项目是有序的,但是set的构造函数可能不知道,并且会对每个插入执行查找。
试试这个:
std::set<T> result;
for (auto item: the_multiset) {
result.insert(result.end(), item);
}
但它仍然不完美,因为它将逐个遍历所有重复值,如果有大量重复值,则会浪费时间。因为它是一个多集,所以内部数据可能就像map<key, count>,
,它应该允许开发人员直接转到下一个不同的值。我希望这可以在未来的C ++中发生。