2017-07-26 10 views
0

std::vector<std::vector<double>> dがあり、std::vector<std::vector<int>> iに割り当てたいとします。私が思い付くことができる最高だった:異なるタイプの多次元ベクトルの割り当て

#include <vector> 
#include <algorithm> 

using namespace std; 

int main() { 
    vector<vector<double>> d = { {1.0, 2.0}, {3.0, 4.0} }; 
    vector<vector<int>> i; 

    for_each(begin(d), end(d), [&i](vector<double> &x) { 
      i.emplace_back(begin(x), end(x)); 
     } 
    ); 

    return 0; 
} 

両ベクターは、内部的に同じタイプを使用していた場合、私はちょうど(C++ copying multidimensional vectorを参照)代入演算子を使用することができます。

i = d; 

ベクトルが格納された場合異なる種類の内部ではなく、一次元、私は何ができる:

i.assign(begin(d), end(d)); 

それらの両方が、私は感じていない自分の意思、本当に明白であることは私のsolutioの場合であります多次元アプローチのためのn。これを行うには、より良い方法、あるいは受け入れられたイディオムがありますか?

答えて

1

使用:

たとえば、あなたが使用することができます。 あなたがベクトルのベクトルのN次元ベクトルをコピーしなければならないときに問題が発生...

することはあなたがすることができます。この場合、

std::vector<std::vector<std::vector<double>>> vvvd 
    { { {1.0, 2.0, 3.0}, { 4.0, 5.0, 6.0} }, 
     { {7.0, 8.0, 9.0}, {10.0, 11.0, 12.0} } }; 

    std::vector<std::vector<std::vector<int>>> vvvi; 

    copy_multi_vec(vvvi, vvvd); 

を次のように場合に働く機能copy_multi_vec()たいとしますヘルパークラスで部分テンプレートの特殊化を使用する。例による

template <typename T1, typename T2> 
struct cmvH 
{ static void func (T1 & v1, T2 const & v2) { v1 = v2; } }; 

template <typename T1, typename T2> 
struct cmvH<std::vector<T1>, std::vector<T2>> 
{ 
    static void func (std::vector<T1> & v1, std::vector<T2> const & v2) 
    { 
     v1.resize(v2.size()); 

     std::size_t i { 0U }; 

     for (auto const & e2 : v2) 
     cmvH<T1, T2>::func(v1[i++], e2); 
    } 
}; 

template <typename T1, typename T2> 
void copy_multi_vec (T1 & v1, T2 const & v2) 
{ cmvH<T1, T2>::func(v1, v2); } 

か、あなたが最後のレベルのためにassign()方法を使用したい場合は

template <typename, typename> 
struct cmvH; 

template <typename T1, typename T2> 
struct cmvH<std::vector<T1>, std::vector<T2>> 
{ 
    static void func (std::vector<T1> & v1, std::vector<T2> const & v2) 
    { 
     v1.resize(v2.size()); 
     v1.assign(v2.cbegin(), v2.cend()); 
    } 
}; 

template <typename T1, typename T2> 
struct cmvH<std::vector<std::vector<T1>>, std::vector<std::vector<T2>>> 
{ 
    static void func (std::vector<std::vector<T1>>  & v1, 
        std::vector<std::vector<T2>> const & v2) 
    { 
     v1.resize(v2.size()); 

     std::size_t i { 0U }; 

     for (auto const & e2 : v2) 
     cmvH0<std::vector<T1>, std::vector<T2>>::func(v1[i++], e2); 
    } 
}; 
を次のように、あなたはヘルパーの構造体を定義することができます
0

これを行うには、より良い方法や受け入れられたイディオムがありますか?

アレイの要素を一度に割り当てることはありません。あなたができることは、それを手助けする機能を作成することです。

template <typename T1, typename T2> 
void vector_copy(std::vector<std::vector<T1>>& dest, 
       std::vector<std::vector<T2>> const& src) 
{ 
    // Add the code to do the copy 
} 

をし、その後、2次元ベクトルのためのソリューションが良いものであるように私には思える

vector_copy(d, i); 
関連する問題