以下代码使用自定义迭代器打印从 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/