使用数组向量的正确方法
Posted
技术标签:
【中文标题】使用数组向量的正确方法【英文标题】:Correct way to work with vector of arrays 【发布时间】:2011-06-04 11:30:00 【问题描述】:有人能告诉我们是什么吗?
我声明了一个数组向量 (vector<float[4]>
),但在尝试 resize
时得到了 error: conversion from 'int' to non-scalar type 'float [4]' requested
。出了什么问题?
【问题讨论】:
你不能拥有原生数组的向量,因为它们既不可分配也不可复制。 【参考方案1】:您不能将数组存储在vector
或任何其他容器中。要存储在容器中的元素的类型(称为容器的值类型)必须是可复制构造和可赋值的。数组都不是。
但是,您可以使用 array
类模板,例如 Boost、TR1 和 C++0x 提供的模板:
std::vector<std::array<double, 4> >
(您需要将std::array
替换为std::tr1::array
以使用C++ TR1 中包含的模板,或者将boost::array
替换为the template from the Boost libraries。或者,您可以编写自己的;这非常简单。)
【讨论】:
第二句在 C++11 中不再正确,但其余的仍然正确。 C++11 中的问题是数组不是Erasable
,至少使用默认分配器。
关于 STL 容器(C++11 后)的要求,请查看此线程,"Has C++11 changed requirements for elements of STL containers, and how?".【参考方案2】:
用途:
vector<vector<float>> vecArray; //both dimensions are open!
【讨论】:
向量的向量不连续,以防 OP 要求。【参考方案3】:下面这段代码没有错误:
float arr[4];
arr[0] = 6.28;
arr[1] = 2.50;
arr[2] = 9.73;
arr[3] = 4.364;
std::vector<float*> vec = std::vector<float*>();
vec.push_back(arr);
float* ptr = vec.front();
for (int i = 0; i < 3; i++)
printf("%g\n", ptr[i]);
输出是:
6.28
2.5
9.73
4.364
结论:
std::vector<double*>
是除了
之外的另一种可能性std::vector<std::array<double, 4>>
James McNellis 建议的。
【讨论】:
在您的示例中, arr 被危险地转换为指针。如果 arr 超出范围而 vec 仍然存在,则会发生未定义的行为(可能是堆栈溢出)。 这只是使向量不可复制。【参考方案4】:向量的每个元素都是float[4]
,因此当您调整每个元素的大小时,需要默认从float[4]
初始化。我认为您尝试使用int
值进行初始化,例如0
?
试试:
static float zeros[4] = 0.0, 0.0, 0.0, 0.0;
myvector.resize(newsize, zeros);
【讨论】:
这(经过明显的小修复)无法编译,原因与接受的答案中给出的相同:它无效,因为普通数组不是有效的容器元素类型。来自g++
的第一个错误:C:/msys64/mingw64/include/c++/10.2.0/bits/stl_uninitialized.h:281:63: error: static assertion failed: result type must be constructible from input type
以上是关于使用数组向量的正确方法的主要内容,如果未能解决你的问题,请参考以下文章