将选定字段从结构上的无序集合存储到向量

Unn*_*nni 2 c++ stl stdvector unordered-set

我有一个unordered_set存储以下结构的

struct match_t{
  size_t score;
  size_t ci;  
};

typedef std::unordered_set<match_t> uniq_t;
Run Code Online (Sandbox Code Playgroud)

现在,我想将的元素存储uniq_t myset;到向量中,但是这样做时,我只想复制分数而不是整个struct。我已经看到了使用assign或分配元素的解决方案back_inserter。我想知道如何从结构中选择所需的字段。我看不到任何参数assignback_inserter为此目的。

我应该push_back为向量尝试覆盖方法还是执行其他方法?

编辑1 我是否可以通过使用这些方法中的任何一种而不是循环遍历集合并分配所需的值来提高性能?

lub*_*bgr 5

简单的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);
Run Code Online (Sandbox Code Playgroud)

另外,您可以使用std::transform自定义lambda:

#include <algorithm>

std::tranform(myset.cbegin(), myset.cend(), std::back_inserter(myvec),
    [](const auto& entry){ return entry.score; });
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用范围库,例如,使用range-v3

#include <range/v3/view/transform.hpp>

std::vector<std::size_t> myvec = myset | ranges::view::transform(&match_t::score);
Run Code Online (Sandbox Code Playgroud)

在性能方面,您不能对所有match_t对象进行线性传递。相反,重要的调整是最大程度地减少分配数量。由于结果的大小std::vector是先验已知的,因此std::vector::reserve如上所述的调用可确保不会发生不必要的分配。