У меня есть образец большого целого класса.
Он содержит динамический массив цифр, которые составляют большое целое число.
Я хотел бы построить объекты этого класса, используя 2 итератора (начало и конец), чтобы я мог передавать цифры из std :: vector или std :: list.
Какой-то псевдокод, иллюстрирующий мою идею:
BigInteger(std::iterator begin, std::iterator end);
...
Использование:
std::vector<int> v;
// fill vector with digits
...
BigInteger b(v.begin(), v.end());
Вопрос: как правильно объявить такой конструктор?
Также даже это возможно?
Спасибо!
Используйте конструктор шаблона:
template<class InputIterator>
BigInteger( InputIterator begin, InputIterator end )
Это должно быть использовано как:
std::vector<int> v; //Fill with values
BigInteger( v.begin(), v.end() );
Вы не можете использовать это просто!
Если вы объявляете типы итераторов как шаблоны, вы можете получить следующее:
template <typename Itr>
BigInteger(Itr begin, Itr end)
{
}
или же
BigInteger(std::vector<int>::iterator begin, std::vector<int>::iterator end)
{
}
Но как насчет std::iterator
, Что ж, std::iterator
класс шаблона, и вы должны предоставить его параметры, и вы должны извлечь из него
class MyItr : public std::iterator<std::input_iterator_tag, int>
{
...
};
BigInteger(MyItr begin, MyItr end)
{
}
Это долгая история! Возможное определение std::iterator
является
template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t,
typename _Pointer = _Tp*, typename _Reference = _Tp&>
struct iterator
{
typedef _Category iterator_category;
typedef _Tp value_type;
typedef _Distance difference_type;
typedef _Pointer pointer;
typedef _Reference reference;
};
Как видите, это просто пустой класс с некоторыми typedef
s. Итак, вы должны реализовать operator*()
, operator->()
, begin()
, end()
… для производного итератора.