c++ - 在 C++ 的链接列表方法中,如何将参数默认为其最后一个索引?

标签 c++ linked-list parameter-passing default-value

我正在尝试在 C++ 中实现 Python 的 list.pop 方法。该方法将索引作为参数,默认为最后一个索引。 Here是一个例子。

我看到实现此目的的唯一方法是将列表的大小包含在参数的默认值中,但这不能在编译时确定,因此 is not a valid default value in C++ .

如何根据需要传递参数?

最佳答案

在这种情况下,我认为您应该使用两种方法而不是默认参数值:

void pop() { removeNode(tail); }
void pop(std::size_t idx) { removeNode(getNode(idx)); }

如果你尝试用一种方法来做,你将不得不决定一个特定的“特殊”值,尽管这实际上是可行的(例如,如果你使用无符号类型,则该类型的最大值,或者 -1 如果你使用签名的),它不是真正的语义,它甚至可能导致错误。例如,一些糟糕的数学运算最终可能会传递 -1。以某种方式出错比弹出最后一个元素要好得多。

当然,这假设您要保留一个尾指针,但如果您计划弹出最后一个元素,那么无论如何您都应该有一个尾指针。 C++ 倾向于采用仅在数据类型上定义有效操作的方法,而如果提供该方法,链表上的线性尾部弹出远远达不到人们期望的效率。


顺便说一句,如果您正在尝试进行健壮的实现(尽管希望您只使用标准库的列表),您应该考虑迭代器。它们不仅更原生于 C++,而且实际上在这方面具有性能优势。从列表中删除索引是线性时间操作。删除迭代器很容易在恒定时间内实现。索引和迭代器之间的用法当然是不同的,因为索引可用于一次移动超过 1 个元素,但我认为如果您不能愉快地使用仅向前移动一个元素的能力或者向后一个元素来做你想对列表做的任何事情,无论如何你都使用了错误的数据结构。将索引与链表一起使用往往会转变为将其视为可以快速执行随机访问的容器,而实际上它远非如此。

关于c++ - 在 C++ 的链接列表方法中,如何将参数默认为其最后一个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34102533/

相关文章:

c++ - 处理 Xlib/Xt 中的 "new top level window"事件

c++ - OpenCV:是否可以用它执行 openGL 像素着色?

java - LinkedList 中的removeFirst() 方法的算法运行时间是多少?

c - 使用递归从末尾开始的第 n 个节点(链表)

c - 使用 while 循环添加到链表结构不保存数据 (IN C)

java - java中传递参数优化

c++ - Const 指针的问题

c++ - C++ 中的 vector : Why does the outer dimension give EXC_BAD_ACCESS and the inner dimension doesn't?

c++ - 编写我自己的内存管理器类,重写 new 和 delete 运算符

tsql - 在TransactSQL中,是否可以创建一个采用可变数量的参数(可选参数)的函数?