在B. Stroustrup的“使用C ++编程原理和实践”一书中,我遇到了一段代码,其中参数是向量类的基本版本的数组。该类定义为
class vector {
int sz;
double * elem;
public:
vector(const vector &);
//...
};
//...
vector::vector(const vector &arg)
:sz{arg.sz},elem{new double[arg.sz]}
{
copy(arg.elem,arg.elem.sz,elem);
}
我的问题:是' arg.elem.sz'一个有效的表达?如果是,这访问是什么?
(顺便说一下,我试着编写一段简单的代码来试试这个,但是我得到了一个错误。由于arg.elem是一个指针,它希望我做一些更像是' arg。 elem->&#39)
谢谢!
EDIT / UPDATE:语法似乎是正确的。看一下copy的定义,这个参数是一个' iterator'。我怀疑必须有一些关于将参数转换为迭代器类型的东西,然后获取第s个指向的元素变得访问迭代器的元素?澄清欢迎:))
答案 0 :(得分:5)
这只是一个错字,arg.elem.sz
不是有效的表达式,因为arg.elem
是double*
,没有成员可以访问(也没有->
opertor )。它应该是arg.elem + arg.sz
,因为这是std::copy
的工作方式。
在您的更新中,您询问了迭代器和std::copy
算法。 std::copy
是function template,如果它们满足input iterator和output iterator的要求,则接受任何类型作为输入和输出迭代器。指向数组元素的指针满足上述要求,因此arg.elem
作为double*
可以用作迭代器。
如果我们将疑问代码行更改为以下代码,那么这将是有道理的:
copy(arg.elem, arg.elem + arg.sz, elem);
上面的代码会将arg.elem
和arg.elem + arg.sz
之间的数组内容复制到elem
指向的数组。
答案 1 :(得分:0)
尝试编译(使用myvector而不是vector来防止与标准向量的冲突)使用gcc获取:
c++ -std=c++11 -o a a.cpp
a.cpp: In copy constructor ‘myvector::myvector(const myvector&)’:
a.cpp:24:26: error: request for member ‘sz’ in ‘arg.myvector::elem’, which is
of non-class type ‘double* const’
copy(arg.elem, arg.elem.sz, elem);
^
我怀疑勘误需要修复为+ sz而不是