2012-12-23 40 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。

由於疲倦,我對任何可能發生的錯誤或其他任何可能的錯誤概不負責。它應該給你一個如何實現這樣的東西的想法。

相關問題