2

リストの特定のインデックスに続くすべての要素を取得したいと思います。これは次のように記述できます。

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

ただし、リストの長さを計算するのはもったいないようです。lrange への最後の引数がオプションで、それを省略するとリストの最後まで続くようになればいいのですが、残念ながら現在はそうではありません。

リストの長さを計算せずに Tcl でこれを効率的に行う他の方法はありますか?

4

2 に答える 2

7

「[llength $foo]」の代わりに「end」を使用できます

そう...

puts [lrange $foo 1 end]

于 2009-09-16T18:12:46.500 に答える
4

ジェフはあなたの実際の質問にうまく答えました。そうは言っても、注目すべき点が1つあります。リスト (実際にはフードの下にあるリスト) の長さを取得するのは O(1) です。つまり、実時間はかかりません。リスト自体の長さはメタデータと共に保存され、再計算されません。唯一の実際のコストは、関数呼び出しのオーバーヘッドです。「end」を使用した方がおそらくまだ高速ですが、思ったほどではありません。

しかし、「実際にはフードの下のリスト」とは、インタープリターが現在それをリストとして扱っていることを意味します (より深い説明がありますが、ここに入る価値はありません)。値に [lrange] を使用しているため、インタープリターはそれを内部的にリストに変換する必要があります...したがって、[llength] の O(1) 動作がほぼ保証されます。

于 2009-09-16T20:56:12.103 に答える