インデックスから開始してTclリストの残りを効率的に取得する方法は?

StackOverflow https://stackoverflow.com/questions/1434545

  •  07-07-2019
  •  | 
  •  

質問

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

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

ただし、リストの長さを計算するのは無駄のようです。 lrangeの最後の引数がオプションであり、リストの最後まで継続することを省略した場合は便利ですが、残念ながら今日はそうではありません。

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

役に立ちましたか?

解決

&quot; end&quot;を使用できます。 &quot; [llength $ foo]&quot;の代わりに

そう...

puts [lrange $ foo 1 end]

他のヒント

ジェフはあなたの実際の質問によく答えました。とはいえ、注目に値することが1つあります。リストの長さ(実際には内部のリスト)を取得するのはO(1)です。つまり、リアルタイムは必要ありません。リスト自体の長さはメタデータとともに保存され、再計算されません。唯一の実際のコストは、関数呼び出しのオーバーヘッドです。 &quot; end&quot;の使用おそらくあなたが考えていたほどではないかもしれません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top