将结构上无序集中的选定字段存储到向量中
Store selected fields from an unordered set on struct to a vector
我有一个 unordered_set
存储以下结构
struct match_t{
size_t score;
size_t ci;
};
typedef std::unordered_set<match_t> uniq_t;
现在我想将 uniq_t myset;
的元素存储到一个向量中,但在这样做时,我只想复制分数而不是整个 struct
。我已经看到使用 assign
或 back_inserter
分配元素的解决方案。我想知道如何 select 只是结构中的必填字段。为此,我没有在 assign
或 back_inserter
中看到任何参数。
我应该尝试覆盖向量的 push_back
方法还是有其他方法可以做到这一点?
编辑 1
通过使用这些方法中的任何一种而不是遍历集合并分配所需的值,我是否会得到任何性能改进?
一个简单的for循环没有错:
std::unordered_set<match_t> myset;
std::vector<std::size_t> myvec;
myvec.reserve(myset.size()); // allocate memory only once
for (const auto& entry : myset)
myvec.push_back(entry.score);
或者,您可以将 std::transform
与自定义 lambda 结合使用:
#include <algorithm>
std::tranform(myset.cbegin(), myset.cend(), std::back_inserter(myvec),
[](const auto& entry){ return entry.score; });
另一种方法是使用范围库,例如范围-v3
#include <range/v3/view/transform.hpp>
std::vector<std::size_t> myvec = myset | ranges::view::transform(&match_t::score);
在性能方面,您不能对所有 match_t
对象的线性传递做任何事情。相反,重要的调整是最小化分配的数量。由于结果 std::vector
的大小是先验已知的,因此如上所示调用 std::vector::reserve
可确保不会发生不必要的分配。
我有一个 unordered_set
存储以下结构
struct match_t{
size_t score;
size_t ci;
};
typedef std::unordered_set<match_t> uniq_t;
现在我想将 uniq_t myset;
的元素存储到一个向量中,但在这样做时,我只想复制分数而不是整个 struct
。我已经看到使用 assign
或 back_inserter
分配元素的解决方案。我想知道如何 select 只是结构中的必填字段。为此,我没有在 assign
或 back_inserter
中看到任何参数。
我应该尝试覆盖向量的 push_back
方法还是有其他方法可以做到这一点?
编辑 1 通过使用这些方法中的任何一种而不是遍历集合并分配所需的值,我是否会得到任何性能改进?
一个简单的for循环没有错:
std::unordered_set<match_t> myset;
std::vector<std::size_t> myvec;
myvec.reserve(myset.size()); // allocate memory only once
for (const auto& entry : myset)
myvec.push_back(entry.score);
或者,您可以将 std::transform
与自定义 lambda 结合使用:
#include <algorithm>
std::tranform(myset.cbegin(), myset.cend(), std::back_inserter(myvec),
[](const auto& entry){ return entry.score; });
另一种方法是使用范围库,例如范围-v3
#include <range/v3/view/transform.hpp>
std::vector<std::size_t> myvec = myset | ranges::view::transform(&match_t::score);
在性能方面,您不能对所有 match_t
对象的线性传递做任何事情。相反,重要的调整是最小化分配的数量。由于结果 std::vector
的大小是先验已知的,因此如上所示调用 std::vector::reserve
可确保不会发生不必要的分配。