STL アルゴリズムは、C++ で非常に便利なものです。しかし、私を苛立たせていることの 1 つは、それらが構成可能性に欠けているように見えることです。
たとえば、 があり、それをペアのメンバーのみを含むvector<pair<int, int>>
に変換したいとします。それはとても簡単です:vector<int>
second
std::vector<std::pair<int, int>> values = GetValues();
std::vector<int> result;
std::transform(values.begin(), values.end(), std::back_inserter(result),
[] (std::pair<int, int> p) { return p.second; });
または、メンバーが偶数vector
のペアのみをフィルタリングしたいかもしれません。first
また、非常に単純です:
std::vector<std::pair<int, int>> values = GetValues();
std::vector<std::pair<int, int>> result;
std::copy_if(values.begin(), values.end(), std::back_inserter(result),
[] (std::pair<int, int> p) { return (p.first % 2) == 0; });
しかし、両方をやりたい場合はどうすればよいでしょうか。transform_if
アルゴリズムはなく、両方transform
を使用すると、中間結果を保持するためにcopy_if
一時的なものを割り当てる必要があるようです:vector
std::vector<std::pair<int, int>> values = GetValues();
std::vector<std::pair<int, int>> temp;
std::vector<int> result;
std::copy_if(values.begin(), values.end(), std::back_inserter(temp),
[] (std::pair<int, int> p) { return (p.first % 2) == 0; });
std::transform(values.begin(), values.end(), std::back_inserter(result),
[] (std::pair<int, int> p) { return p.second; });
これは私にはかなり無駄に思えます。一時的なベクトルを回避するために私が考えることができる唯一の方法は、放棄transform
しcopy_if
て単純に使用することですfor_each
(または通常の for ループ、あなたの好みに合ったもの):
std::vector<std::pair<int, int>> values = GetValues();
std::vector<int> result;
std::for_each(values.begin(), values.end(),
[&result] (std::pair<int, int> p)
{ if( (p.first % 2) == 0 ) result.push_back(p.second); });
ここで何か不足していますか?一時的なストレージを必要とせずに、2 つの既存の STL アルゴリズムを新しいものに構成する良い方法はありますか?