将多集转换为集的有效方法
Efficient way to convert multiset to set
有没有一种有效的方法可以将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++中实现。
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法