【发布时间】:2018-08-19 03:35:49
【问题描述】:
读完这段代码,教你如何构建一个简单的双精度向量:
class vector
{
int sz;
double* elem;
public:
vector(int s)
:sz{s}, elem{new double[sz]}
{
for (int i = 0; i < sz; ++i)elem[i] = 0.0;
}
vector(initializer_list<double>lst)
:sz{ int(lst.size()) }, elem{ new double[sz] }
{
copy(lst.begin(), lst.end(), elem);
}
vector(const vector&);
~vector(){ delete[] elem; }
double get(int n) const { return elem[n]; }
void set(int n, double v) { elem[n] = v; }
};
复制构造函数定义为:
vector::vector(const vector& arg)
:sz{ arg.sz }, elem{new double[arg.sz]}
{
copy(arg.elem, arg.elem + sz, elem);
}
arg.elem, arg.elem + sz 的范围实际上不应该是
arg.elem, arg.elem + sz - 1
?
【问题讨论】:
-
你为什么这么认为?
-
通常范围的结尾不包括在内,而开头是。这允许您传递空范围。
-
@NeilButterworth 因为 arg.elem + sz 看起来它正在向范围传递一个额外的空元素。我认为 arg.elem 暗示 elem[0] 而 arg.elem + sz 暗示 elem[sz]。
标签: c++ algorithm c++11 stdvector