向量不会复制成数组吗?
Posted
技术标签:
【中文标题】向量不会复制成数组吗?【英文标题】:Vector will not copy into an array? 【发布时间】:2015-10-13 22:49:36 【问题描述】:仍在学习 C++。
我正在将一个 CSV 文件导入一个向量
我已正确构建向量,但在将向量转换为数组时遇到问题,并且出现此错误: 无法在赋值中将 '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<double> labelsVec;
因为labels
只有一个维度。
【参考方案1】:
您不需要将vector<double>
复制到double*
,除非在非常特殊的情况下。该标准保证向量元素存储在连续的内存中,因此您基本上可以将vector<T>
的第一个元素的地址用作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<ml::TrainData> tData = ml::TrainData::create(trainDataMat, ml::SampleTypes::ROW_SAMPLE, labelsMat); svm->trainAuto(tData);
感谢您的帮助!【参考方案3】:
尝试改变
vector<vector<double>> labelsVec;
到
vector<double> labelsVec;
您正尝试将 doubles 的 array 插入 doubles 的向量 的 vector。
【讨论】:
以上是关于向量不会复制成数组吗?的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在 C++ 中将二维数组/向量作为函数参数传递? [复制]
C ++创建一个向量大小的数组,然后将向量复制到C样式数组中[重复]