7

如何以规范的方式在 C++11 中定义前向输出迭代器?

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

定义一个扩展两者的私有标签是否规范,forward_iterator_tag或者output_iterator_tag是否有更好的解决方案?

4

1 回答 1

6

规范的做法是仅继承自std::iterator<std::forward_iterator_tag, T>。迭代器只有一个类别。

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

相反,该标准具有向前/双向/随机访问类别的可变与不可变迭代器的想法。所有需要通过迭代器写入的算法,并且需要比单遍更好的算法,也可以通过它们写入的相同迭代器来读取。这是std::removestd::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以提供您想要的信息。

于 2012-12-27T23:38:15.023 回答