2017-02-22 66 views
0

Я хочу скопировать значения a из вектора foos в другой вектор с только значением int. Какой самый быстрый способ сделать это?C++ Скопируйте элементы из вектора объекта в вектор с этим элементом

#include <vector> 

struct Foo { 
    int a; 
}; 

int main() { 
    std::vector<Foo> foos; 
    for(int i = 0; i < 100; i++) 
     foos[i].a = i; 

    std::vector<int> somenumbers; 
    //Fastest way to copy the ints from the struct into the somenumbers vector? 

    return 0; 
} 
+0

использовать [std :: transform] (http://en.cppreference.com/w/cpp/algorithm/transform), а затем профиль, чтобы убедиться, что это фактически узкое место, прежде чем пытаться его оптимизировать. – Borgleader

+2

Что бы вы ни делали, позвоните 'reserve' на' somenumbers', прежде чем добавлять что-либо к нему. – NathanOliver

ответ

3

Что вы хотите сказать быстрее? Просто цикл, алгоритм или что-то еще. Например:

std::transform 
(
    foos.begin(), foos.end(), std::back_inserter(somenumbers), 
    [](const Foo& v) { return v.a; } 
); 

Кроме того, так как вы знаете размер вектора - вы должны вызвать reserve.

+0

вот что я имел в виду, thx – Shedex

3
somenumbers.reserve(foos.size()); 
for(const auto& f : foos) somenumbers.emplace_back(f.a); 

Если вы делаете эту операцию несколько раз в вашем коде, ввести абстракцию: (. forward_like can be found here)

template <typename TRange, typename TF> 
auto map_vector(TRange&& range, TF&& f) 
{ 
    using type = std::decay_t<decltype(f(*std::begin(range)))>; 

    std::vector<type> result; 
    result.reserve(range.size()); 

    for(auto&& x : range) result.emplace_back(forward_like<TRange>(x)); 
    return result; 
} 

Использование:

auto somenumbers = map_vector(foos, [](const auto& x){ return x.a; });