2017-02-22 40 views
0

我想將foos向量中的a值複製到另一個向量中,其值僅爲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

無論你做什麼,在添加任何東西之前,先在'somenumbers'上調用'reserve'。 – 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; });