将multiset转换为set的有效方法

时间:2014-04-08 18:10:06

标签: c++ set multiset

是否有一种有效的方法将multiset转换为set,而不是循环multimap中的所有元素,如果set有元素则测试,如果是,则插入如果不继续?对于multiset和set,我更喜欢使用库存C ++容器,但其他语言实现也​​没问题。

3 个答案:

答案 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 ++中发生。