2

我想获取列表特定索引之后的所有元素。这可以写成:

set foo {0 1 2 3 4 5 6 <...> n}
puts [lrange $foo 1 [llength $foo]]

但是,计算列表的长度似乎是一种浪费。如果 lrange 的最后一个参数是可选的并且省略它意味着继续到列表末尾,那就太好了,但是,可惜今天不是这种情况。

在不计算列表长度的情况下,是否有其他方法可以在 Tcl 中有效地执行此操作?

4

2 回答 2

7

您可以使用“end”代替“[llength $foo]”

所以...

puts [lrange $foo 1 end]

于 2009-09-16T18:12:46.500 回答
4

杰夫很好地回答了你的实际问题。话虽如此,有一点值得注意。获取列表的长度(实际上是引擎盖下的列表)是 O(1),这意味着它不需要真正的时间。列表本身的长度与元数据一起存储,不会重新计算。唯一真正的成本是函数调用的开销。使用“end”可能仍然更快,只是没有你想象的那么多。

但是“实际上是一个列表”,我的意思是解释器目前正在将其视为一个列表(有更深入的解释,但不值得在这里讨论)。由于您在值上使用 [lrange],解释器必须将其内部转换为列表......所以您几乎可以保证 [llength] 的 O(1) 行为。

于 2009-09-16T20:56:12.103 回答