我有样本大整数类。 它包含包含大整数的动态数字数组。 我想使用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());
问题是:如何正确声明这样的构造函数? 甚至可能吗?
谢谢!
答案 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()
,....