我正在为我的线性代数库开发一个自定义迭代器。我有以下代码(http://www.cplusplus.com/reference/iterator/iterator/略有修改(
template<class T, std::size_t Increment = 1>
class iter: public std::iterator<std::random_access_iterator_tag, T>{
private:
T* m_pter;
public:
iter(T* value): m_pter(value){}
iter(const iter& other_it): m_pter(other_it.m_pter){}
iter& operator++() { m_pter+=Increment; return *this; }
// iter& operator+() { m_pter += Increment; return *this; }
bool operator!=(const iter& rhs) {return m_pter!=rhs.m_pter;}
bool operator<(const iter& rhs) {return m_pter<rhs.m_pter;}
T& operator*() { return *m_pter; }
};
主要:
int main(int argc, char *argv[]){
std::vector<int> a = {1,2,3,4,5,6,7,8,9};
iter<int, 2> from( &a[0] );
iter<int, 2> to( &a[8] + 1 );
for(;from < to;++from){std::cout << *from << std::endl;}
// std::for_each(from, to, [](int i){std::cout << i << " ";});
std::cout << std::endl;
}
返回: $ ./main 1 3 5 7 9
这正是我想要的。但是使用标准::for_each...版本返回:
$ ./main
1 3 5 7 9 135121 0 0 many zeros ...
我不知道为什么 std 算法会"跳过"我的最后一个元素。
std::for_each
使用!=
但是由于元素的数量为奇数,因此永远不会达到相等。
如果替换循环,则会出现相同的错误
for(; from < to; ++from)
由
for(;from != to;++from)
如果你声明迭代器作为随机访问:所有比较运算符,修复前和后修复++
和--
、+=
、-=
、+
和-
,带有整型类型,并在迭代器之间-
。
但这不是眼前的问题。 眼前的问题是普遍使用的结束条件是==
,并且在一个跨步迭代器,你必须防止超越一个过了尽头。 实际上,这意味着您需要两个指针,一个在当前位置,一个过去最后,你需要这样的东西:
Iter& operator+=( ptrdiff_t n )
{
m_current = std::min( m_end - m_current, n * stride );
return *this;
}
更糟糕的是:要支持从过去一个结束的减法,你需要计算出你会增加多少才能到达那里,哪个表示跟踪最后一个增量,或保留指针也传递给迭代器。
你可能想看看Boost跳跃的箍 filter_iterator
. (最后,跨步迭代器只是筛选迭代器的特殊情况。 它并不漂亮,但是这是关于你能做的最好的事情,给定C++定义的方式迭代器。
你能尝试提供operator==()
吗?
我认为这是std::foreach()
使用的那个