我正在通过构建自己的向量版本来练习 C++,名为“向量”。我有两个构造函数,填充构造函数和范围构造函数。他们的声明如下所示:
template <typename Type>
class Vector {
public:
// fill constructor
Vector(size_t num, const Type& cont);
// range constructor
template<typename InputIterator> Vector(InputIterator first, InputIterator last);
/*
other members
......
*/
}
fill 构造函数用 num 的 val 填充容器;并且范围构造函数将范围 [first, last) 中的每个值复制到容器中。它们应该与 STL 向量的两个构造函数相同。
他们的定义如下:
//fill constructor
template <typename Type>
Vector<Type>::Vector(size_t num, const Type& cont){
content = new Type[num];
for (int i = 0; i < num; i ++)
content[i] = cont;
contentSize = contentCapacity = num;
}
// range constructor
template <typename Type>
template<typename InputIterator>
Vector<Type>::Vector(InputIterator first, InputIterator last){
this->content = new Type[last - first];
int i = 0;
for (InputIterator iitr = first; iitr != last; iitr ++, i ++)
*(content + i) = *iitr;
this->contentSize = this->contentCapacity = i;
}
但是,当我尝试使用它们时,我很难区分它们。例如:
Vector<int> v1(3, 5);
使用这行代码,我打算创建一个包含三个元素的 Vector,每个元素都是 5。但是编译器使用范围构造函数,将“3”和“5”都视为“InputIterator”的实例,毫无疑问,这会导致错误。
当然,如果我将代码更改为:
Vector<int> v1(size_t(3), 5);
一切都很好,调用了填充构造函数。但这显然不直观且用户友好。
那么,有没有一种方法可以直观地使用填充构造函数?