Я занимаюсь С++, создавая свою собственную версию вектора с именем "Вектор". У меня есть два конструктора, среди которых - конструктор заполнения и конструктор диапазонов. Их декларации выглядят следующим образом:
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
......
*/
}
Конструктор заполнения заполняет контейнер числом val; и конструктор диапазона копирует каждое значение в диапазоне [первый, последний] в контейнер. Они должны быть одинаковыми с двумя конструкторами вектора 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);
С этой строкой кода я намеревался создать Вектор, содержащий три элемента, каждый из которых равен 5. Но компилятор идет для конструктора диапазона, рассматривая как "3", так и "5" как экземпляры "InputIterator", который без сюрпризов вызывает ошибку.
Конечно, если я сменил код на:
Vector<int> v1(size_t(3), 5);
Все в порядке, вызывается конструктор заполнения. Но это, очевидно, не является интуитивным и удобным для пользователя.
Итак, есть ли способ, с помощью которого я могу интуитивно использовать конструктор заполнения?