将多集转换为集的有效方法

Efficient way to convert multiset to set

本文关键字:有效 方法 转换      更新时间:2023-10-16

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

std::set<T> new_set(multiset_obj.begin(), multiset_obj.end();应该能做到这一点。让语言和容器需求成为您的朋友。

您可以从现有的多集创建一个集

template<typename T>
set<T> SetFromMultiset(multiset<T> const &ms)
{
    set<T> ret(ms.cbegin(), ms.cend())
    return ret;
}

我假设您使用的是c++11,因此按值返回容器没有开销,只有移动操作(即使这是RVO应用的情况)

我不确定以上答案是否最有效。

multiset中的项是有序的,但set的构造函数可能不知道这一点,并且会在每次插入时执行查找。

试试这个:

std::set<T> result;
for (auto item: the_multiset) {
    result.insert(result.end(), item);
}

但它仍然不完美,因为它会逐一遍历所有重复值,如果有大量重复值,它会浪费时间。因为它是一个多集,所以内部数据可以像map<key, count>,一样,它应该允许开发人员直接转到下一个不同的值。我希望这能在未来的C++中实现。