将多维数组复制到向量,反之亦然
Copy multidimensional array to vector and vice versa
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(或任何其他函数)将多维数组复制到向量,反之亦然?
您不能直接这样做,而是通过中间步骤。根据您的需求,像这样的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;
}
您基本上需要编写自己的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, ...);
中的丑陋。
由于疲劳,我不承担任何off-by- 1错误或其他奇怪的可能发生在这个。它应该给你一个如何实现这样的东西的想法。
您必须编写自己的迭代器,它在解引用时产生一个helper对象,该对象在赋值时将一维数组复制到具有std::copy
的向量(并且为了向相反方向复制,另一个迭代器执行相反的操作)。基本上,看看back_insert_iterator
是如何实现的,并做几乎相同的事情,只是代替push_back
调用std::copy
。
我个人认为不值得。我只是使用for
循环的外部副本。你已经有了一个,只需将std::copy
添加到它的主体,就在resize
之后。
注意,如果你事先resize
你的向量,你不需要std::back_inserter
,因为它会分配更多的存储空间。使用begin
代替。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 快速将无符号字符的向量强制转换为POD结构的向量,反之亦然
- 封送处理 - 转换 std::向量<char>到字符串^ 反之亦然
- C++:将无符号长整整转换为向量<char>,反之亦然
- 将多维数组复制到向量,反之亦然