自定义双向链表迭代器
Custom doubly linked list iterator
正如标题所示,我为迭代器制作了自己的模板,如下所示:
template <class Element>
class IteratorDL {
private:
DoubleNode<Element> *current;
public:
IteratorDL(DoublyList<Element>);
~IteratorDL();
void next();
void back();
bool isValid();
Element getCurrent();
};
template <class Element>
IteratorDL<Element>::IteratorDL(DoublyList<Element> dl) {
current = dl.first;
cout << current->info; //this will return to me the correct value that I'm looking for
}
template <class Element>
Element IteratorDL<Element>::getCurrent() {
if (isValid()) {
COUT << current->info; // this will return to me something like an address, random numbers, I don't know.
return current->info;
}
else {
return 0;
}
}
我只发布了真正困扰我的2个功能。我应该在双向链表(相同的,定制的)上使用它。 DoubleNode
看起来像这样:
模板
class DoubleNode {
private:
Element info;
DoubleNode *next;
DoubleNode *back;
我遇到的问题是 getCurrent()
没有 return 它应该 return 对我来说节点当前包含的值但是它 return 对我来说就像一个地址,我真的说不出来。我对迭代器代码进行了注释,以便您可以更好地理解发生了什么,而且我对 C++ 还很陌生,这就是为什么我可能不明白哪里出了问题。
我也试过将链表作为迭代器的私有部分,但还是没有解决问题。经过进一步研究,我相信 getCurrent()
是 return 内存的其他部分,所以出于某种原因,在那个特定的函数中,current->info
不会导致它应该去的地方?
我也尝试过这种方法:
private:
DoublyList<Element> dl;
DoubleNode<Element> *current;
但同样的问题
使用调用函数的代码进行编辑:
DoublyList<int> dl;
dl.addFirst(1);
dl.addFirst(2);
dl.addFirst(3);
dl.addFirst(4);
int c;
IteratorDL<int> *it = new IteratorDL<int>(dl);
cout << it->getCurrent(); //this should return 4 but it returns random number
// c = it->getCurrent();
// assert(c == 4);
编辑双重列表声明:
template <class Element>
class DoublyList {
private:
DoubleNode<Element> *first;
DoubleNode<Element> *last;
int count;
在构造函数代码中有 current = dl.first
Current 是一个指针,您可以为其分配一个从构造函数复制参数中获得的指针值。
当您调用 getCurrent() 时,current 指向的内存在 getCurrent 调用中不再有效,因为在构造函数调用时创建了列表的临时副本,并且在调用之后不再存在。(如果您没有定义复制构造函数,编译器只需复制 class)
的成员
通过在参数名称之前添加 & 这成为一个引用参数,这意味着代码通过引用直接处理原始列表,并且由于列表在 getCurrent 调用时仍然存在,所以它可以工作
正如标题所示,我为迭代器制作了自己的模板,如下所示:
template <class Element>
class IteratorDL {
private:
DoubleNode<Element> *current;
public:
IteratorDL(DoublyList<Element>);
~IteratorDL();
void next();
void back();
bool isValid();
Element getCurrent();
};
template <class Element>
IteratorDL<Element>::IteratorDL(DoublyList<Element> dl) {
current = dl.first;
cout << current->info; //this will return to me the correct value that I'm looking for
}
template <class Element>
Element IteratorDL<Element>::getCurrent() {
if (isValid()) {
COUT << current->info; // this will return to me something like an address, random numbers, I don't know.
return current->info;
}
else {
return 0;
}
}
我只发布了真正困扰我的2个功能。我应该在双向链表(相同的,定制的)上使用它。 DoubleNode
看起来像这样:
模板
class DoubleNode {
private:
Element info;
DoubleNode *next;
DoubleNode *back;
我遇到的问题是 getCurrent()
没有 return 它应该 return 对我来说节点当前包含的值但是它 return 对我来说就像一个地址,我真的说不出来。我对迭代器代码进行了注释,以便您可以更好地理解发生了什么,而且我对 C++ 还很陌生,这就是为什么我可能不明白哪里出了问题。
我也试过将链表作为迭代器的私有部分,但还是没有解决问题。经过进一步研究,我相信 getCurrent()
是 return 内存的其他部分,所以出于某种原因,在那个特定的函数中,current->info
不会导致它应该去的地方?
我也尝试过这种方法:
private:
DoublyList<Element> dl;
DoubleNode<Element> *current;
但同样的问题
使用调用函数的代码进行编辑:
DoublyList<int> dl;
dl.addFirst(1);
dl.addFirst(2);
dl.addFirst(3);
dl.addFirst(4);
int c;
IteratorDL<int> *it = new IteratorDL<int>(dl);
cout << it->getCurrent(); //this should return 4 but it returns random number
// c = it->getCurrent();
// assert(c == 4);
编辑双重列表声明:
template <class Element>
class DoublyList {
private:
DoubleNode<Element> *first;
DoubleNode<Element> *last;
int count;
在构造函数代码中有 current = dl.first
Current 是一个指针,您可以为其分配一个从构造函数复制参数中获得的指针值。
当您调用 getCurrent() 时,current 指向的内存在 getCurrent 调用中不再有效,因为在构造函数调用时创建了列表的临时副本,并且在调用之后不再存在。(如果您没有定义复制构造函数,编译器只需复制 class)
的成员
通过在参数名称之前添加 & 这成为一个引用参数,这意味着代码通过引用直接处理原始列表,并且由于列表在 getCurrent 调用时仍然存在,所以它可以工作