在向量中插入向量<vector>元素时出现分割错误



在名为Stamp的类的构造函数中,有两个向量:

  • vector<double> data的大小为data.size()
  • vector<vector <double>> collectedData的大小为[nsamples][data.size((/nsamples]

我需要循环它们才能有这样的东西:

  • CCD_ 5具有第一个";nsamples";data元素
  • "collectedData[1][0->nsamples]"具有第二个";nsamples";data的元素
  • CCD_ 8’具有第i个";nsamples";data的元素(如果我遍历data.size(),则为"0"(

这是我正在尝试的C++代码,但我收到了分段错误。我不明白这是算法问题,还是vector问题的错误使用:

Stamp(vector<double> data, int nsamples) : data(data), nsamples(nsamples){
long ll = data.size()/nsamples;
int row;
//Reserve space in collectedData:
collectedData.reserve(nsamples);
for (int i=0;i<nsamples;i++){
collectedData[i].reserve(ll);
}
for (int i=0;i<=data.size();i+=nsamples){

for (int j=0;(j<=nsamples)&&((row*i)<data.size());j++){
collectedData[i].push_back(data[i]);
}
row++;
}
}

首先,reserve()函数只保留空间,而没有实际添加元素。您应该使用resize()来添加(或删除(元素。

其次,for循环中的条件i<=data.size()是错误的。您不能使用data[data.size()]。应该是i<data.size()

第三,似乎不能保证data.size() <= nsamples,因此您应该再次添加元素,以免在第二个for循环中导致collectedData[i]的访问超出范围。

最后,正如@molbdnilo在评论中指出的那样,使用非静态局部变量row的值而不进行初始化。在使用之前,您应该为变量设置一些适当的值。

Stamp(vector<double> data, int nsamples) : data(data), nsamples(nsamples){
long ll = data.size()/nsamples;
int row = 0; // initialize row
//Reserve space in collectedData:
if (collectedData.size() < nsamples){
collectedData.resize(nsamples); // use resize() to add elements
}
if (collectedData.size() < data.size()){
collectedData.resize(data.size()); // use resize() again to allocate enough size
}
for (int i=0;i<nsamples;i++){
collectedData[i].reserve(ll); // using reserve() here because elements are added via push_back() later
}
for (int i=0;i<data.size();i+=nsamples){ // use correct condition

for (int j=0;(j<=nsamples)&&((row*i)<data.size());j++){
collectedData[i].push_back(data[i]);
}
row++;
}
}

最新更新