使用数组向量的正确方法

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

以上是关于使用数组向量的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

使用存储在向量中的对象的正确方法是啥?

C++ - 创建类对象向量时使用删除的正确方法

c ++初始化结构向量的正确方法

提取数组中非 NaN 元素的索引和值的正确方法

如何正确地将字符数组写入文本文件

向量数组,计算点积