首先,我对 C++ 相当陌生,所以如果这是初学者编码错误,那么我很抱歉。
我目前正在为我在学校得到的家庭作业准备一个绘图课。我应该能够将边存储在集合、数组和链表中。由于我在单独的课程中完成了所有这些工作,因此我现在正试图通过模板使它们全部一起工作。对ie来说一切正常。std::set,但是当我使用我自己的链表实现时,它会以某种方式失败 - 看起来我的迭代器在某个地方搞砸了,并且它们上的前缀和后缀运算符都会导致相同的行为(在 for 循环中)。我还要补充一点,我没有使用 std::list 因为我应该自己实现链表。
我当前的迭代器实现:
template<typename T>
class Iterator{
public: node<T>* pointer;
public:
Iterator(): pointer(0){}
Iterator(node<T>* _pointer): pointer(_pointer){}
Iterator<T> operator++() { pointer = pointer->next; }
Iterator<T> operator++(int) { pointer = pointer->next; }
bool operator!=(Iterator<T> rval){ return !(pointer == rval.pointer); }
bool operator==(Iterator<T> rval){ return (pointer == rval.pointer); }
node<T>* operator()(){ return pointer; }
T operator*(){ return pointer->data; }
};
单链表节点:
template <typename T>
struct node{
node(): next(0){}
node(T val): data(val), next(0){}
node(node<T>* _next): data(0), next(_next){}
node(T val, node<T>* _next): data(val), next(_next){}
T data;
node<T>* next;
};
以及我的列表类如何实现 begin() 和 end():
typedef Iterator<T> iterator;
iterator begin() { return iterator(new node<T>(b)); }
iterator end() { return iterator(); }
注意b
指向链表中的第一个元素
最后是我如何访问元素(这是在包含列表的不同类中):
void tree_recurse_f(int node, std::ofstream* file, int level = 0){
[some output code here]
typename T::iterator it;
for (it = Database[node].first.begin(); it != Database[node].first.end(); ++it){
tree_recurse_f(*it, file, (level+1));
}
}
Database
是一个std::map<int,std::pair<>>
并且.first
指向由T
(set, list or vector)指定的类型
现在解决问题:
- 不知何故,对于 list' 的当前实现
begin()
,它指向输出函数中的一个空节点(++it 和 it++ 产生相同的结果) - 更改
begin()
toreturn iterator(b)
似乎消除了 for 循环中的错误,尽管 ++it 和 it++ 都导致相同的事情 - 我已经设法通过仅测试列表类来发现这两个错误 - 如果我将它实现到图形类中,它会在输出函数中进入一个永无止境的循环(*它总是指向 0 并且似乎不会随着 + +它)
对我来说,迭代器看起来像是一些奇怪的东西(尤其是它单独工作的事实,但在另一个类中却没有)
// 如果有人好奇,我会大致遵循http://www.cplusplus.com/articles/Lw6AC542/上的链表教程