5
int dArray[1600][32];
vector < vector <int> > dVector;

n= 1600; k = 32
dVector.resize(n);
for(int i = 0 ; i < n ; ++i){
dVector[i].resize(k);
}

std::copy ( dArray, dArray + tmp_c, std::back_inserter (dVector));

std :: copy(またはその他の関数)を使用して多次元配列をベクトルにコピーしたり、その逆を行うにはどうすればよいですか?

4

3 に答える 3

2

直接行うことはできませんが、中間のステップがあります。要件によっては、このようなものvector_wrapperがうまくいくかもしれません

#include <vector>

template<typename T, int N> struct vector_wrapper {
    vector_wrapper(T (&a)[N]) {
        std::copy(a, a + N, std::back_inserter(v));
    }

    std::vector<T> v;
};

int dArray[1600][32];
std::vector<vector_wrapper<int, 32> > dVector;

int main(int argc, char **argv)
{
    std::copy(dArray, dArray + 1600, std::back_inserter(dVector));
    return 0;
}
于 2012-12-23T16:14:47.690 に答える
1

基本的には、独自の種類のoutput iterator. 少し醜いですが、次のようなものがうまくいくはずです:

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

template <typename ContainerOfContainer, typename Container, std::size_t n>
struct nested_back_inserter : public std::iterator<std::output_iterator_tag, void, 
                                                   void, void, void>
{
   std::size_t k;
   std::size_t current_;
   ContainerOfContainer* container_;

   explicit nested_back_inserter(ContainerOfContainer& cont)
     : k(0), current_(0), container_(&cont)
   { }

   nested_back_inserter& operator=(typename Container::value_type value)
   {
       if(k == n) {
           ++current_;
           k = 0;
       }
       (*container_)[current_].push_back(value);
       ++k;
       return *this;
   }

   nested_back_inserter& operator*()
   {
       return *this;
   } 

   nested_back_inserter& operator++()
   {
       return *this;
   }

   nested_back_inserter& operator++(int)
   {
       return *this;
   }
};

int main()
{
    int arr[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
    std::vector<std::vector<int>> v;

    for(unsigned i = 0; i < 3; ++i) {
        std::vector<int> vi;
        v.push_back(vi);
    }

    typedef std::vector<std::vector<int>> nested;
    typedef std::vector<int> cont;
    std::copy(arr[0], arr[2] + 3, nested_back_inserter<nested, cont, 3>(v));

    for(auto it = v.begin(); it != v.end(); ++it) {
        std::cout << "{";
        for(auto it2 = it->begin(); it2 != it->end(); ++it2) {
                std::cout << *it2 << ", ";
        }
        std::cout << "}\n";
    }

    return 0;
}

の醜さに特に注意してくださいstd::copy(arr[0], arr[2] + 3, ...);

疲労のために、これで発生する可能性のあるオフバイワンエラーまたはその他の奇妙さについて、私は責任を負いません. ただし、このようなものを実装する方法についてのアイデアが得られるはずです。

于 2012-12-23T16:14:04.723 に答える
0

間接参照時に、割り当て時に1次元配列をベクトルにコピーするヘルパーオブジェクトを生成する独自のイテレーターを作成する必要がありますstd::copy(反対方向にコピーする場合は、反対の方向にコピーする別のイテレーター)。基本的に、実装方法を見て、呼び出しback_insert_iteratorの代わりに、ほとんど同じことを行います。push_backstd::copy

個人的にはそれだけの価値はないと思います。for外側のコピーにはループを使用します。std::copyあなたはすでにそれを持っています、ちょうどその直後に、その体に追加してresizeください。

事前にベクターを使用している場合は、さらに多くのストレージが割り当てられるため、resize必要ないことに注意してください。代わりにstd::back_inserter使用してください。begin

于 2012-12-23T16:00:08.733 に答える