自定义迭代器和 STL 算法出错



我正在为我的线性代数库开发一个自定义迭代器。我有以下代码(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()使用的那个

最新更新