2012-12-27 39 views
7

如何以规范的方式定义C++ 11中的forward-output-iterators?定义正向输出迭代器的规范方法

根据标准,forward_iterator只是一个input_iterator。所以相应的forward_iterator_tag只延伸input_iterator_tag。如果我们使用std::iterator来定义我们的迭代器,我们使用什么标签作为前向输出迭代器?

定义一个可以扩展forward_iterator_tagoutput_iterator_tag的私有标签是否正规?还是有更好的解决方案?

+0

继承他们两个都会做 –

+0

作为一个侧面的问题:有谁知道这些可变的迭代器标签是否被认为是标准库?如果是这样,为什么他们不包括在内? –

回答

6

规范的事情是只从std::iterator<std::forward_iterator_tag, T>继承。迭代器只有一个类别。

该标准对于也是前向迭代器的输出迭代器没有算法(或其他用途)。标准中输出迭代器的所有用途只需要单遍。

相反,该标准的想法是可变的与不可变的迭代器的类别forward/bidi/randomaccess。所有需要通过迭代器写入的算法,需要比单遍更好的算法,也可以通过它们写入的相同迭代器读取。这是std::remove,std::sort和其他变异算法。

可变和不可变迭代器之间的差异不会被迭代器标记检测到,而是由赋值表达式是否格式良好决定的。因此,举例来说,如果您将迭代器传递给std::sort,这是不可变的,那么该算法无论如何都不会编译,所以通常不需要使用output_iterator_tag来标记输入迭代器。所有需要OutputIterator的算法都可以使用可变的ForwardIterator,同样也不需要使用output_iterator_tag来标记它。

如果你有不同于标准算法的需求,那么我不能立即想到你的提议对你的迭代器不起作用的原因。但它不会检测可变标准迭代器。例如std::deque<int>::iteratorint*的迭代器类别为random_access_iterator_tag,而不是您的私有标记,并且与output_iterator_tag没有任何关系。所以你可能会更好地定义你自己的特质类,而不是希望适应现有的iterator_traits::iterator_category来提供你想要的信息。

+0

谢谢!这清理了很多东西。最后这意味着不可变的迭代器返回指向元素的const引用/副本,以防止通过返回的引用进行赋值,对吧? – MFH

+1

@MFH:没错。对容器的不可变迭代器返回'const T&'(我没有检查它是否实际需要,或者它们是否被允许返回代理)。其他不可变的迭代器可以返回任何可转换为“T”的东西。 –