【问题标题】:In a link list method in C++, how to default an argument to its last index?在 C++ 中的链接列表方法中,如何将参数默认为其最后一个索引?
【发布时间】:2015-12-05 15:51:17
【问题描述】:

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

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

如何根据需要传递参数?

【问题讨论】:

  • 那么您是在问如何传递一个无效的参数?
  • 问题是关于参数传递,而不是函数的效果。我添加了一个示例并修改了问题。

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


【解决方案1】:

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

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

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

当然,这确实假设您保留了一个尾指针,但如果您打算弹出最后一个元素,那么无论如何您都应该有一个尾指针。 C++ 倾向于采用仅在有效的情况下定义数据类型操作的方法,而链表上的线性尾部弹出与提供该方法时人们所期望的效率相去甚远。


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

【讨论】:

  • 如前所述,使用具有线性结构的索引在语义上是不好的。这并不意味着是商业的、健壮的代码,而是学术活动的一部分。
猜你喜欢
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2011-07-29
相关资源
最近更新 更多