2017-07-28 7 views
1

私は以下のように構造体のベクトルを持っています。構造体はプロットの関連データを保持します。構造体のベクトルから特定のメンバーのベクトルを取得します

struct DATA_T 
{ 
    double x; 
    double y; 
    double z; 
} 

std::vector<DATA_T> results; 

私は結果ベクトル内のすべてのxの値を取得し、私はプログラム的にこれらのベクトルを作成することができることを知っているダブルス

のベクトルとして保存できるようにする必要があります。

std::vector<double> x_values; 
x_values.reserve(results.size()); 
for(auto const &data : results) 
{ 
    x_values.push_back(data.x); 
} 

しかし、私はもっと簡潔な解決策があるのだろうかと思っていました。おそらく、同様のアプローチを使用して、find_ifを使用して特定のデータポイントを検索する方法は?

+3

あなたは 'のstd :: transform'を使用することができますが、私はそれがどんな速いかになりますことを疑います'push_back'を呼び出す前にベクトルに適切な量を予約してください。 – user463035818

+0

[C++ std :: transform vector with pairs-> new vector](https://stackoverflow.com)と重複している可能性があります。/questions/9094132/c-stdtransform-pair-first-to-new-vector) –

答えて

1

あなたはxを取得するために、適切なラムダでそれを提供することについてstd::transformを使用することができます。

std::vector<double> x_values; 
x_values.reserve(results.size()); 

std::transform(std::cbegin(results), std::cend(results), 
    std::back_inserter(x_values), 
    [](const auto& data) { 
     return data.x; 
    } 
); 

DEMO

+0

おそらく、 '' for''ループアプローチは、この特定のコード '' std :: transform'の読みやすさを失うことなく、より良い選択肢になる可能性があるので、 – iyop45

+0

@ iyop45です。しかし、一般的なケースでは、単一の場所にあまりにも多くのSTLアルゴリズムは、全く可読性を保証しません:) –

関連する問題