c++ - 将结构上无序集中的选定字段存储到 vector

标签 c++ stl stdvector unordered-set

我有一个 unordered_set 存储以下结构

struct match_t{
  size_t score;
  size_t ci;  
};

typedef std::unordered_set<match_t> uniq_t;

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

我应该尝试重写 vector 的 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 可确保不会发生不必要的分配。

关于c++ - 将结构上无序集中的选定字段存储到 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55590007/

相关文章:

Android JNI 本地引用表,转储当前状态

c++ - std::vector.clear() 是否在每个元素上删除(可用内存)?

c++ - 是否应该更喜欢 STL 算法而不是手动循环?

c++ - 用于格式化的字符串参数与模板参数

c++ - BAADF00D 访问冲突

c++ - 将 1 加到由数字数组表示的数字

c++ - 在 std::unordered_map 中查找对应于相同值的所有键

c++ - 迭代 boost::python vector_indexing_suite 出现意外结果

c++ - Valgrind 在 C++ 代码中显示意外输出

c++ - 我可以在不复制的情况下将 std::vector<char> 重新解释为 std::vector<unsigned char> 吗?