C++自定义迭代器构造函数

标签 c++ constructor iterator

以下代码使用自定义迭代器打印从 0 到 9 的数字。我用 g++ -std=c++11 -o test test.cpp

编译
#include <iostream>

class some_class;

class some_class_iterator : public std::iterator<std::forward_iterator_tag, int>{   private:    
    friend class some_class;
    int pointed;
    some_class_iterator(int _pointed): pointed(_pointed){
        std::cout << "over here" << std::endl;
    }

public: 
    int poitned;

    int operator*(){
        return pointed;
    }

    const some_class_iterator& operator++(){
        pointed++;
        return *this;
    }

    bool operator!=(const some_class_iterator& other) const {
        return this->pointed != other.pointed;
    }   

};

class some_class{
public:
    typedef some_class_iterator iterator;

    iterator begin(){
        return some_class_iterator(0);  
    }

    iterator end(){
        return some_class_iterator(10);
    }

};


int main(){

    some_class a;
    for (some_class::iterator i = a.begin(); i != a.end(); ++i) std::cout << *i << std::endl;   

}

但是,输出不是我预期的那样,因为 over here 被打印了多次。 例如实际输出是:

over here
over here
0
over here
1
over here
2
over here
3
over here
4
over here
5
over here
6
over here
7
over here
8
over here
9
over here

那么是谁引起了对构造函数的调用?

我的实际问题是在二叉搜索树迭代器上,在构造函数中我创建了一个 FIFO 遍历,其中要打印的节点取决于(in、pre、post),因此多次调用构造函数是昂贵的。

最佳答案

循环的每次迭代调用 a.end(),这将创建一个新的迭代器并打印“over here”。您可以打印出 _pointed 的值来查看。 (第一个“在这里”来自 begin 调用)。

关于C++自定义迭代器构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40723017/

相关文章:

c++ - 将 NSInteger 传递给 size_t 并将 NSInteger* 传递给 size_t*

javascript - 构造函数可以返回什么值来避免返回 this?

c++ - 交换时增量迭代器 std::next

c++ - begin(container) 和 end(container) 是否标准化?

c++ - 如何使用 g++ 编译带有根库的 C++ 程序?

c++ - Qt 4 Sqlite,QDataWidgetMapper 问题

c++ - C++中构造函数的返回类型

c++临时对象创建了吗?

c++ - 使用模板实现 const 范围

c++ - 使用辅助方法操作字符串的范围问题