在名为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++;
}
}