「Vector」という名前の独自のバージョンのベクターを作成して、C++ を練習しています。とりわけ、fill コンストラクターと range コンストラクターの 2 つのコンストラクターがあります。それらの宣言は次のようになります。
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
......
*/
}
塗りつぶしコンストラクターは、コンテナーを num の val で塗りつぶします。範囲コンストラクターは、範囲 [first, last) 内のすべての値をコンテナーにコピーします。それらは、STL ベクターの 2 つのコンストラクターと同じであると想定されています。
それらの定義は次のとおりです。
//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 つの要素を含む Vector を作成するつもりでした。これは当然のことながら、エラーを引き起こします。
もちろん、コードを次のように変更すると:
Vector<int> v1(size_t(3), 5);
すべて問題なく、fill コンストラクターが呼び出されます。しかし、それは明らかに直感的でユーザーフレンドリーではありません。
では、塗りつぶしコンストラクターを直感的に使用できる方法はありますか?