首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义迭代器和STL算法的错误

自定义迭代器和STL算法的错误
EN

Stack Overflow用户
提问于 2014-10-20 07:31:34
回答 3查看 122关注 0票数 2

我正在为我的线性代数库开发一个自定义迭代器。我有以下代码(稍微修改了http://www.cplusplus.com/reference/iterator/iterator/)

代码语言:javascript
复制
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; }
};

主要是:

代码语言:javascript
复制
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..。版本返回:

代码语言:javascript
复制
$ ./main
1 3 5 7 9 135121 0 0 many zeros ...

我不知道为什么std算法“跳过”了我的最后一个元素。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-20 07:42:03

std::for_each使用!=,但是由于您有一个奇数的元素,所以永远无法达到相等。

如果替换循环,则会出现相同的错误。

代码语言:javascript
复制
for(; from < to; ++from)

通过

代码语言:javascript
复制
for(;from != to;++from)
票数 1
EN

Stack Overflow用户

发布于 2014-10-20 09:18:02

如果您将迭代器声明为随机访问,则需要提供更多的函数:所有比较运算符,修复前后的++--+=-=+-,以及迭代器之间的-

但这不是眼前的问题。中间的问题是,普遍使用的结束条件是==,而在跨步迭代器中,您必须防止超过一个结束。实际上,这意味着您需要两个指针,一个在当前位置,一个在结束后,您需要如下所示:

代码语言:javascript
复制
Iter& operator+=( ptrdiff_t n )
{
    m_current = std::min( m_end - m_current, n * stride );
    return *this;
}

更糟糕的是:为了支持一次过结束时的减法,您需要计算出到那里的增量会增加多少,这意味着要么跟踪最后一个增量,要么将指针传递给迭代器。

您可能想看看它的filter_iterator中的循环推进跳跃。(最后,跨步迭代器只是过滤迭代器的特例。)这并不好看,但考虑到C++定义迭代器的方式,这是您所能做的最好的事情。

票数 1
EN

Stack Overflow用户

发布于 2014-10-20 07:33:37

你能试着提供operator==()

我想这是std::foreach()用的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26460488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档