【发布时间】:2021-08-06 15:30:19
【问题描述】:
在一个名为Stamp的类的构造函数中有两个向量:
-
vector<double> data的大小为data.size() -
vector<vector <double>> collectedData的大小为 [nsamples][data.size()/nsamples]
我需要循环它们才能有这样的东西:
-
collectedData[0][0->nsamples]具有data的第一个“nsamples”元素 - 'collectedData[1][0->nsamples]' 具有
data的第二个“nsamples”元素 - ...
-
'collectedData[i][0->nsamples]' 具有data的第 i 个“nsamples”元素(如果我超过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++;
}
}
【问题讨论】:
-
i<=data.size()off-by-one error 在这里。 -
.reserve(...)与std::vector上的.resize()不同。在第一个循环中,collectedData[i]无法返回对有效内部向量对象的引用,因为它尚未构造。长话短说:将第一个reserve更改为resize。 -
感谢@MikeCAT,一个周期后仍然给出“分段错误(核心转储)”
-
collectedData.reserve(nsamples);不保证有nsamples元素,只是保证它们有足够的空间(即collectedData仍然有相同的size(),但可能有不同的capacity())。你想要resize。 -
你忘了初始化
row。
标签: c++ algorithm vector segmentation-fault computer-science