0

我有样本大整数类。它包含组成大整数的动态数字数组。我想使用 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());

问题是:如何正确声明这样的构造函数?还有可能吗?

谢谢!

4

2 回答 2

2

使用模板构造函数:

template<class InputIterator>
BigInteger( InputIterator begin, InputIterator end )

这应该像这样使用:

std::vector<int> v; //Fill with values    
BigInteger( v.begin(), v.end() );
于 2013-05-15T19:40:48.553 回答
1

你不能简单地使用它!

如果将迭代器类型声明为模板,则可以这样:

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(), ... 。

于 2013-05-15T20:08:10.590 回答