我正在努力学习c ++。我创建了一个矢量类vec
,我正在尝试实现一种计算点积的方法。
它编译得很好但运行时出现分段错误。我已将dot
产品方法中的x(i)引用固定为原因,但我不知道为什么。我收集它是关于错误地访问内存的东西,但我不知道我做错了什么,也不知道正确的方式。
我的矢量类:
class vec{
private:
vector<double> data;
int n; // size
public:
vec (int s) { n = s; data.reserve(n); }
double get(int i) { return data[i]; }
void set(int i, double val) { data[i] = val; }
int size() { return n; }
double operator[] (int i) { return get(i); }
double operator() (int i) { return get(i); }
double dot (vec x) {
assert(n == x.size());
int z = 0;
for (int i = 0; i < n; i++){
z += data[i] * x(i);
}
return z;
}
};
我试图像这样使用它:
int main(int argc, char *argv[]) {
vec x = vec(3);
x.set(0, 1);
x.set(1, 1);
x.set(2, 2);
vec y = vec(3);
y.set(0, 2);
y.set(1, 2);
y.set(2, 3);
double z = x.dot(y);
}
答案 0 :(得分:3)
改变这个:
data.reserve(n);
对此:
data.resize(n);
reserve
不会在向量中创建项目。它所做的就是增加容量。要预先实际创建n
个对象,请使用resize
。
另外在旁注中,我强烈建议您不使用n
之类的无关变量来跟踪矢量的大小。请改用vector::size()
功能。原因是如果由于某种原因导致n
未正确更新,则会冒错误。
因此,这应该是你的构造函数:
vec (int s) : data(s) {}
并转储n
成员变量。
答案 1 :(得分:-2)
在本节中:
vec y = vec(3);
y.set(0, 2);
y.set(1, 2);
y.set(2, 3);
您正在设置索引3,这超出了此向量的范围。要解决此问题,请将vec
初始化为长度4
,或将索引初始化为其他位置。 :)
你也应该调整大小而不是保留,但是这样做不应该导致段错误。它应该让人迷惑。