C ++:如何使用两个迭代器构造对象?

时间:2013-05-15 19:33:35

标签: c++ stl iterator construction

我有样本大整数类。 它包含包含大整数的动态数字数组。 我想使用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 个答案:

答案 0 :(得分:2)

使用模板构造函数:

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

这应该用作:

std::vector<int> v; //Fill with values    
BigInteger( v.begin(), v.end() );

答案 1 :(得分: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;
    };

正如您所看到的,它只是一个带有typedef个{s}的空类。因此,您必须为派生迭代器实现operator*()operator->()begin()end(),....