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

问题描述 投票:2回答:1

我有一个unordered_set存储以下结构

struct match_t{
  size_t score;
  size_t ci;  
};

typedef std::unordered_set<match_t> uniq_t;

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

我应该尝试重写载体的push_back方法还是有其他方法来做这个?

编辑1我是否通过使用任何这些方法而不是循环遍历集合并分配所需的值来获得任何性能改进?

c++ stl stdvector unordered-set
1个回答
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);

或者,您可以将std::transform与自定义lambda一起使用:

#include <algorithm>

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

另一种方法是使用范围库,例如使用range-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的调用确保不会发生不必要的分配。

© www.soinside.com 2019 - 2024. All rights reserved.