我正在为我的线性代数库开发一个自定义迭代器。我有以下代码(稍微修改了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
这正是我想要的。但是使用std::for_each..。版本返回:
$ ./main
1 3 5 7 9 135121 0 0 many zeros ...我不知道为什么std算法“跳过”了我的最后一个元素。
发布于 2014-10-20 07:42:03
std::for_each使用!=,但是由于您有一个奇数的元素,所以永远无法达到相等。
如果替换循环,则会出现相同的错误。
for(; from < to; ++from)通过
for(;from != to;++from)发布于 2014-10-20 09:18:02
如果您将迭代器声明为随机访问,则需要提供更多的函数:所有比较运算符,修复前后的++和--,+=,-=,+和-,以及迭代器之间的-。
但这不是眼前的问题。中间的问题是,普遍使用的结束条件是==,而在跨步迭代器中,您必须防止超过一个结束。实际上,这意味着您需要两个指针,一个在当前位置,一个在结束后,您需要如下所示:
Iter& operator+=( ptrdiff_t n )
{
m_current = std::min( m_end - m_current, n * stride );
return *this;
}更糟糕的是:为了支持一次过结束时的减法,您需要计算出到那里的增量会增加多少,这意味着要么跟踪最后一个增量,要么将指针传递给迭代器。
您可能想看看它的filter_iterator中的循环推进跳跃。(最后,跨步迭代器只是过滤迭代器的特例。)这并不好看,但考虑到C++定义迭代器的方式,这是您所能做的最好的事情。
发布于 2014-10-20 07:33:37
你能试着提供operator==()吗
我想这是std::foreach()用的
https://stackoverflow.com/questions/26460488
复制相似问题