Нет ничего плохого в простом цикле 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
с пользовательской лямбдой:
#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
, как показано выше, гарантирует, что ненужное распределение не произойдет.