2012-12-23 41 views
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(或任何其他函数)将多维数组复制到矢量,反之亦然?将多维数组复制到矢量,反之亦然

回答

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; 
} 
+0

谢谢,这工作很直接。 –

+0

如何打印dVector? – chefarov

+0

@chefarov最简单的方法可以嵌套循环,也可以为'vector_wrapper'定义一个输出运算符,然后打印最外面的'vector'。 –

0

你将不得不编写自己的迭代器,它在解引用时会产生一个辅助对象,它在赋值时将一维数组复制到一个带有std::copy的向量(并且复制到相反方向,另一个迭代器相反)。基本上,看看back_insert_iterator是如何实现的,而且几乎完全相同,只是调用std::copy而不是push_back

我个人认为这不值得。我只是使用for循环作为外部副本。你已经有了一个,只需在resize后面加上std::copy即可。

请注意,如果您事先使用resize载体,则不需要std::back_inserter,因为它将分配更多存储空间。改为使用begin

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, ...);的uglyness。

由于疲倦,我对任何可能发生的错误或其他任何可能的错误概不负责。它应该给你一个如何实现这样的东西的想法。

相关问题