我的教授要求我们从头开始重新实现所有LinkedList函数。但是,由于这是一个初学者班,他已经对它做了一些规定。以下是完整的作业:
“对于列表,你必须实现除get_allocator之外的所有东西。对于所有以”iterator“作为参数的函数,而是接受一个节点类。对于所有返回迭代器的函数,改为返回一个节点。”
由于LinkedList使用指针,我不知道如何在不返回指针的情况下返回节点。返回一个名为* current的指针所指向的节点的语法是什么?
我也不确定如何格式化这些功能。例如,更改以下函数以接受节点类然后返回节点的语法是什么(我不需要函数的代码,只需要如何接受节点并返回节点类):
iterator insert (iterator position, const int&x)
答案 0 :(得分:1)
"对于列表,您必须实现除get_allocator之外的所有内容。对全部 采用"迭代器"的函数作为一个论点,而是接受一个 节点类。对于返回迭代器的所有函数,返回一个节点 代替"
由于LinkedList使用指针,我不知道如何返回一个节点 而不只是返回一个指针。什么是语法 返回一个名为* current?
的指针所指向的节点
我认为你的教授正在讨论接受和返回节点的指针(或引用),而不是节点值(复制节点)。我可以说有一定程度的信心,因为这是保留std :: list的底层语义的唯一方法,它将迭代器一对一地转换为节点(节点指针)。
但是,如果你的节点本身只是存储指针的聚合并且不尝试进行任何内存管理,那么你可以放弃复制它们,但如果有疑问,我会指点指针
所以,像这样:
iterator insert(iterator position, const T& val)
{
...
}
对于你的练习作业看起来像这样:
LinkedListNode* insert(LinkedListNode* position, const T& val)
{
...
}
如果您没有使用模板,可以将其作为整数列表或其他内容:
LinkedListNode* insert(LinkedListNode* position, int val)
{
...
}
希望您的教授稍后会让您体会基于迭代器的版本的强大功能,因为这些版本允许您编写的函数模板不仅适用于链接列表,还适用于任何类型的序列,例如。
答案 1 :(得分:0)
我认为你不应该使用指针。尝试使用引用或迭代器?
答案 2 :(得分:0)
要取消引用指针,请使用*
运算符。例如,如果您有一个指向int
的有效指针,并且您希望访问权限使用它指向的int
:
*pointer_to_int = 5;
j = *pointer_to_int / 3;
等等。同样,如果要将指向 - int
的值传递给函数,
k = SomeFunction(*pointer_to_int, 12, foo);
或从函数返回:
int Function() {
return *pointer_to_int;
}
您可以在任何地方使用*pointer
语法,variable
。
声明返回类型的函数的语法不会根据类型而改变。假设您有一些函数返回int
:
int MyFunction() { return my_int; }
或者,如果它返回了迭代器:
iterator MyFunction() { return my_iterator; }
或者,如果它返回Apple:
Apple MyFunction() { return my_apple; }
你看,你只需要用你要返回的任何类型替换返回类型的名称。
希望您现在可以看到如何声明一个返回node
对象的函数,以及如何返回一个node
对象,假设您只有pointer_to_node
。