【问题标题】:C++: How to construct object with two iterators?C++:如何用两个迭代器构造对象?
【发布时间】:2013-05-10 12:35:09
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 那么,有没有办法使用一些“通用迭代器类型”?
  • 没有“通用迭代器类型”。考虑 int* 是一个有效的迭代器。
  • @DaddyM 没有简单的方法,因为没有通用的迭代器类型。你必须创建一个。这可能不值得麻烦。
  • 我认为 v 是一个 int 或类似的向量。

标签: c++ stl iterator construction


【解决方案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-&gt;(), begin(), end(), ... 派生迭代器。

【讨论】:

  • 请告诉我应该实现什么而不是...?
  • @DaddyM:使用模板传递迭代器是常见且简单的方法。 std::iterator 不是直接的方法,你必须覆盖很多成员,它只是一个空类。
【解决方案2】:

使用模板构造函数:

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

这应该像这样使用:

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

【讨论】:

  • 那么,有没有办法使用一些“通用迭代器类型”?
  • 我需要使用对迭代器的引用而不是仅仅复制迭代器对象吗?是否可行且效率更高?
  • 那么 InputIterator 是一种常见的迭代器类型。如果你愿意,你也可以使用 Iterator。参考有效,但显然不通过参考使用迭代器是常见的做法。检查这个答案:stackoverflow.com/questions/1104035/generic-iterator-in-c
  • 感谢您的专业知识。
猜你喜欢
  • 1970-01-01
  • 2019-12-03
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多