【问题标题】: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。出了什么问题?

【问题讨论】:

  • 你不能拥有原生数组的向量,因为它们既不可分配也不可复制。

标签: c++ arrays vector stdvector


【解决方案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。或者,您可以编写自己的;这非常简单。)

【讨论】:

【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2017-01-19
  • 1970-01-01
  • 2015-12-15
相关资源
最近更新 更多