【问题标题】:Efficient way to convert multiset to set将多重集转换为集的有效方法
【发布时间】:2017-02-10 05:29:49
【问题描述】:

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

【问题讨论】:

  • 为什么不直接插入所有元素呢? set 本身会防止重复,您不必这样做。除此之外,除非您事先跟踪重复项,否则没有比插入所有元素更有效的方法来插入所有元素。

标签: c++ set multiset


【解决方案1】:

std::set<T> new_set(multiset_obj.begin(), multiset_obj.end(); 应该可以解决问题。让语言和容器要求成为您的朋友。

【讨论】:

  • 最后需要一个右括号
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    multiset 中的项目是有序的,但 set 的构造函数可能不知道,并且会对每个插入执行查找。

    试试这个:

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

    但是还是不完美,因为它会一个一个的遍历所有的重复值,如果有大量的重复值,那就浪费时间了。因为它是一个多重集,所以内部数据可以只是像map&lt;key, count&gt;, 这样的东西,它应该允许开发人员直接进入下一个不同的值。我希望这可以在未来的 C++ 中发生。

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 2011-09-10
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 2013-05-23
      • 2016-04-30
      相关资源
      最近更新 更多