我已经实现了一个迭代器的例子,它对每个增量进行计数:
#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,也可以用作Input迭代器:
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
确实
n-1
如果源迭代器不是RandomAccessIterator并且
n
增量(如果是)?