向量不会复制成数组吗?

Posted

技术标签:

【中文标题】向量不会复制成数组吗?【英文标题】:Vector will not copy into an array? 【发布时间】:2015-10-13 22:49:36 【问题描述】:

仍在学习 C++。

我正在将一个 CSV 文件导入一个向量,将其更改为一个数组数组,然后创建一个 Mat(一种 openCV 数据类型)用于在 SVM 中进行训练。

我已正确构建向量,但在将向量转换为数组时遇到问题,并且出现此错误: 无法在赋值中将 'std::vector' 转换为 'double'

由于某种原因,第一个复制语句出现此错误,而循环中的复制语句工作正常。

vector< vector<double> > labelsVec;
vector< vector<double> > trainingDataVec;
read_csv(infile1, labelsVec);
read_csv(infile2, trainingDataVec);
double labels[178] = 0.0;
double trainingData[178][5] = 0.0;

copy(labelsVec.begin(), labelsVec.end(), labels);

for (int row = 0; row < trainingDataVec.size(); ++row) 
  copy(trainingDataVec[row].begin(), trainingDataVec[row].end(), trainingData[row]);


Mat labelsMat(178, 1, CV_32SC1, labels);
Mat trainDataMat(178, 5, CV_32FC1, trainingData);

【问题讨论】:

您似乎正试图将一个双精度数组插入到一个双精度向量的向量中。 我想你想要vector&lt;double&gt; labelsVec; 因为labels 只有一个维度。 【参考方案1】:

您不需要将vector&lt;double&gt; 复制到double*,除非在非常特殊的情况下。该标准保证向量元素存储在连续的内存中,因此您基本上可以将vector&lt;T&gt; 的第一个元素的地址用作T* 的数组。 C++11 已经通过data() 方法为您提供了这个功能。

我从未使用过 OpenCV,所以我不知道它是否需要整个数据矩阵是连续的,所以我实际上不确定这个解决方案是否适用于您的问题。

这当然不直接适用于二维数据,但您可以轻松地使用解决方法,只为第一个维度填充一个数组,看看this code:

#include <iostream>
#include <vector>

using namespace std;

void foo(double** data, size_t i, size_t j)

   for (size_t ii = 0; ii < i; ++ii)
     for (size_t jj = 0; jj < j; ++jj)
       cout << data[ii][jj] << endl;


int main(void) 
    vector<vector<double>> data = 0.0f, 1.0f, 2.0f, 3.0f;

    const size_t rows = data.size();
    const size_t cols = data[0].size();

    double** arrayData = new double*[rows];

    for (size_t i = 0; i < rows; ++i)
      arrayData[i] = &data[i][0];
    // ^ this obtains the address of first element of i-th row,
    //   where the vector data begins
    //   you can use arrayData[i] = data[i].data() if you have C++11 support

    foo(arrayData, rows, cols);

    delete [] arrayData;

    return 0;

我使用动态分配只是因为硬编码大小可能不是一个好主意(取决于优化要求等)。

【讨论】:

【参考方案2】:

在声明中

copy(labelsVec.begin(), labelsVec.end(), labels);

labelsVec.begin() 返回一个指向vector 类型的指针——因为你的labelsVec 是双精度的vector——而labels 是一个double 类型的数组:这些类型不兼容.我建议完全重新考虑这个实现,因为将向量复制到数组中很奇怪,除非在特定情况下(如上所述),而且解决方案也不那么复杂。

【讨论】:

这让我觉得做copy(labelsVec[0].begin(), labelsVec[0].end(), labels); 应该可以工作,但我得到的错误是 double free or corruption (out): 0x00000000022000d0 这实际上是由我的程序的另一部分引起的。 (当我尝试将我的 svm 再训练两行时)Ptr&lt;ml::TrainData&gt; tData = ml::TrainData::create(trainDataMat, ml::SampleTypes::ROW_SAMPLE, labelsMat); svm-&gt;trainAuto(tData); 感谢您的帮助!【参考方案3】:

尝试改变

vector<vector<double>> labelsVec;

vector<double> labelsVec;

您正尝试将 doublesarray 插入 doubles 的向量vector

【讨论】:

以上是关于向量不会复制成数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 C++ 中将二维数组/向量作为函数参数传递? [复制]

C ++创建一个向量大小的数组,然后将向量复制到C样式数组中[重复]

C++ RGB 图像数据叠加成二维数组(向量的向量)

R中的函数可以返回两个向量吗? [复制]

在没有向量、指针的情况下在 C++ 中在运行时增加数组大小 [关闭]

C ++ 11分段错误试图将数组(<算法>)动态复制到向量中