C++: Как построить объект с двумя итераторами?

У меня есть образец большого целого класса. Он содержит динамический массив цифр, которые составляют большое целое число. Я хотел бы построить объекты этого класса, используя 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());

Вопрос: как правильно объявить такой конструктор? Также даже это возможно?

Спасибо!

2 ответа

Решение

Используйте конструктор шаблона:

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;
    };

Как видите, это просто пустой класс с некоторыми typedefs. Итак, вы должны реализовать operator*(), operator->(), begin(), end()... для производного итератора.

Другие вопросы по тегам