2012-03-14 14 views
3

値[0,1,2,3,4,5,6,7,8,9]のベクトルを仮定します。必ずしも連続していない値を参照するベクトルを作成するにはどうすればよいですか? [3,4,7,9]、すなわちある指数で与えられ、STLを使用する。ベクトルの特定の要素を含むサブベクトルの作成

+0

奇妙なことに、http://stackoverflow.com/questions/9705441と似ていますが、非順次です。 – Flexo

+0

同じソリューションを適用できますか?その質問はちょうどそれから飛び出しました。私は2日の時間で尋ねるなら、あなたはまだそれを言うだろうか? –

+0

類似しているが、異なるソリューションを必要とするには十分に異なる。 – juanchopanza

答えて

3

あなたは例えば、変換としてこれを表現することができます。:

#include <valarray> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 
#include <vector> 

template <typename T> 
void pick(std::vector<T>& result, const std::vector<T>& in, const std::vector<typename std::vector<T>::size_type>& s) { 
    result.reserve(s.size()); 
    std::transform(s.begin(), s.end(), std::back_inserter(result), 
       [&in](typename std::vector<T>::size_type idx) { 
        return in.at(idx); 
       }); 
} 

int main() { 
    const std::vector<int> arr={0,1,2,3,4,5,6,7,8,9,10}; 
    std::vector<int> result; 
    pick(result, arr, {3,4,7,9}); 
} 

を私はラムダを使用していますが、このためにstd::bindか(現在は非推奨)std::bind2ndを使用することができます。 C++ 11のstd::bind

例はpickます:

template <typename T> 
void pick(std::vector<T>& result, const std::vector<T>& in, const std::vector<typename std::vector<T>::size_type>& s) { 
    result.reserve(s.size()); 
    std::transform(s.begin(), s.end(), std::back_inserter(result), 
       std::bind(static_cast<const T& (std::vector<T>::*)(typename std::vector<T>::size_type) const>(&std::vector<T>::at), in, std::placeholders::_1)); 
} 

それはしかし真剣に醜いだからのthe need to cast the member function pointer to resolve the overloadat(非constバージョン対のconst)の。

+1

はい、私も 'std :: bind2nd'と考えていましたが、' std :: transform'はとてもいいです。美しい解決策! –

+1

上記は**それを超過している非常に良い例です**。 –

+0

@refpよく、これはとても良い例です。私はそれに固執する。 –

関連する問題