使用数组向量的正确方法

Pul*_*nha 58 c++ arrays vector stdvector

有人能说出使用数组向量的正确方法是什么?

我声明了一个数组(vector<float[4]>)的向量,但error: conversion from 'int' to non-scalar type 'float [4]' requested在尝试时得到resize了.出了什么问题?

Jam*_*lis 116

您无法将数组存储在vector任何其他容器中.要存储在容器中的元素类型(称为容器的值类型)必须是可复制构造和可分配的.数组都不是.

但是,您可以使用array类模板,如Boost,TR1和C++ 0x提供的类模板:

std::vector<std::array<double, 4> >
Run Code Online (Sandbox Code Playgroud)

(您想更换std::arraystd::tr1::array使用包含在C++ TR1的模板,或者boost::array使用从Boost库的模板或者,你可以写你自己的.这是非常简单的.)

  • 第二句在C++ 11中不再适用,但其余的仍然是正确的.C++ 11中的问题是数组不是[`Erasable`](http://en.cppreference.com/w/cpp/concept/Erasable),至少是默认的分配器. (3认同)

Naw*_*waz 9

使用:

vector<vector<float>> vecArray; //both dimensions are open!
Run Code Online (Sandbox Code Playgroud)

  • 在OP需要的情况下,向量的向量不是连续的. (10认同)

小智 8

以下代码中没有错误:

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]);
Run Code Online (Sandbox Code Playgroud)

输出是:

6.28

2.5

9.73

4.364

结论:

std::vector<double*>
Run Code Online (Sandbox Code Playgroud)

是另一种可能性

std::vector<std::array<double, 4>>
Run Code Online (Sandbox Code Playgroud)

James McNellis建议说.

  • 在你的例子中,arr被危险地转换为指针.如果arr超出范围而vec仍然存在,则会发生未定义的行为(可能是堆栈溢出). (7认同)
  • 这只是使矢量不可复制. (3认同)

Mar*_*som 5

向量的每个元素都是a float[4],所以当你调整大小时,每个元素都需要默认从a初始化float[4].我认为你尝试用int类似的值进行初始化0

尝试:

static float zeros[4] = {0.0, 0.0, 0.0, 0.0};
myvector.resize(newsize, zeros);
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的'[4]`在错误的地方.此外,具有静态存储的对象会自动进行零初始化. (2认同)