我实现了一个迭代器的示例,它计算每个增量:
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
template <class IteratorCategory = std::vector<int>::iterator::iterator_category>
class DereferenceCountingIterator : public std::vector<int>::iterator {
public:
using iterator_category = IteratorCategory;
public:
static std::size_t increaseCnt;
DereferenceCountingIterator(
typename std::vector<int>::iterator iter)
: std::vector<int>::iterator(iter) {}
auto& operator++() {
++increaseCnt;
return std::vector<int>::iterator::operator++();
}
DereferenceCountingIterator<IteratorCategory> operator+(difference_type diff) {
return static_cast<std::vector<int>::iterator&>(*this).operator+(diff);
}
};
此模板类既可以用作 RandomAccess 也可以用作输入迭代器:
template<class IteratorCategory>
std::size_t DereferenceCountingIterator<IteratorCategory>::increaseCnt = 0;
using RandomAccessDereferenceContingIterator = DereferenceCountingIterator<>;
using NonRandomAccessDereferenceContingIterator
= DereferenceCountingIterator<std::input_iterator_tag>;
应用程序示例:
int main() {
auto vec = std::vector<int>{3, 4, 5};
auto rAVecBegin = RandomAccessDereferenceContingIterator(vec.begin());
auto nonRAVecBegin = NonRandomAccessDereferenceContingIterator(vec.begin());
{
const auto incBefore = RandomAccessDereferenceContingIterator::increaseCnt;
auto out = std::vector<int>{};
std::copy_n(rAVecBegin, 3, std::back_inserter(out));
const auto incAfter = RandomAccessDereferenceContingIterator::increaseCnt;
std::cout << incAfter - incBefore << std::endl;
}
{
const auto incBefore = NonRandomAccessDereferenceContingIterator::increaseCnt;
auto out = std::vector<int>{};
std::copy_n(nonRAVecBegin, 3, std::back_inserter(out));
const auto incAfter = NonRandomAccessDereferenceContingIterator::increaseCnt;
std::cout << incAfter - incBefore << std::endl;
}
return 0;
}
该程序的输出如下(在
libstdc++
和 libc++
中):
3
2
我能否确定
copy_n
在源迭代器不是 RandomAccessIterator 时准确地执行 n-1
增量,如果是的话 n
增量?
如果不是 RandomAccessIterator,我能否确定 copy_n 在源迭代器上精确执行 n-1 增量,如果是,则执行 n 增量?
不,对增量数量没有要求。
如果迭代器只是输入迭代器,而不是前向迭代器,则强制实现精确执行
n
或 n-1
递增到最后一个解引用的迭代器或之后未解引用但必须有效的迭代器。输入迭代器无法以任何其他方式迭代源序列。
如果迭代器是前向迭代器甚至随机访问迭代器,则对数字增量没有要求,并且实现也可以递减或使步长大于增量/减量。
也不要求按顺序复制序列。
唯一的复杂性要求是准确地进行
n
分配。