4

ISO C++11 24.3:

template <class InputIterator, class Distance>
void advance(InputIterator& i, Distance n);
// ...
template <class ForwardIterator>
ForwardIterator next
(
    ForwardIterator x,
    typename std::iterator_traits<ForwardIterator>::difference_type n = 1
);

为什么std::next不接受InputIterators?

我正在考虑的法律用例之一是:

first = find(next(first, x), last, 11); // ...

我找到了合适的博士

next/prev返回一个递增的迭代器,而不改变原始迭代器的值。但是,即使这样也可能使InputIterator. AForwardIterator是保证“多通道”属性所必需的。

但我不明白 multipass/invalidation 与此有何关系。使用相同的多通道/无效推理,我们甚至可以禁止std::finds InputIterator

template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value);

与sstd::next相比std::findstd::vector::insert(pos, first, last)具有完全合法的用例没有什么特别之处InputIterator

此外std::next(it, n),可以在泛型代码中使用,它不仅在InputIterators 上运行。

4

1 回答 1

8

实际上,输入迭代器不能被有效地复制,因为一旦输入迭代器递增,任何留在周围的副本都将失效。

std::next接受一个迭代器并返回另一个已经高级的迭代器n。在不使原始迭代器无效的情况下,您无法使用输入迭代器执行此操作,这std::next毫无意义。相比之下,std::advance将指定的迭代器n时间推进,这对于输入迭代器来说很好。

std::next是 的迭代器泛化operator+(T*, size_t)std::advance是 的迭代器泛化operator+=(T*&, size_t)。很可能std::advance,就像operator+=应该返回一个引用而不是 void。

确实存在std::find(和相关功能)类似的问题;它们也会使指定输入迭代器的任何副本无效。但委员会很可能认为这个问题不那么严重。

于 2013-10-27T00:17:37.230 回答