Documentation
¶
Overview ¶
パッケージringは循環リストに対する操作を実装します。
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Ring ¶
type Ring struct {
Value any
// contains filtered or unexported fields
}
Ringは循環リスト、またはリングの要素です。 リングには先頭も末尾もありません。どのリング要素へのポインタも リング全体への参照として機能します。空のリングはnilのRingポインタで 表されます。Ringのゼロ値は、Valueがnilの1要素のリングです。
func (*Ring) Do ¶
Doはリングの各要素に対して、前方向の順序で関数fを呼び出します。 fが*rを変更した場合、Doの振る舞いは未定義です。
Example ¶
package main
import (
"github.com/shogo82148/std/container/ring"
"github.com/shogo82148/std/fmt"
)
func main() {
// サイズ5の新しいリングを作成します。
r := ring.New(5)
// リングの長さを取得します。
n := r.Len()
// リングにいくつかの整数値を設定します。
for i := 0; i < n; i++ {
r.Value = i
r = r.Next()
}
// リングを走査して内容を出力します。
r.Do(func(p any) {
fmt.Println(p.(int))
})
}
Output: 0 1 2 3 4
func (*Ring) Len ¶
Lenはリングr内の要素数を計算します。 実行時間は要素数に比例します。
Example ¶
package main
import (
"github.com/shogo82148/std/container/ring"
"github.com/shogo82148/std/fmt"
)
func main() {
// サイズ4の新しいリングを作成します。
r := ring.New(4)
// その長さを出力します。
fmt.Println(r.Len())
}
Output: 4
func (*Ring) Link ¶
Linkはリングrとリングsを接続し、r.Next()がsになるようにして、 r.Next()の元の値を返します。rは空であってはなりません。
rとsが同じリングを指している場合、それらをリンクすると rとsの間の要素がリングから削除されます。削除された要素は サブリングを形成し、結果はそのサブリングへの参照になります (要素が削除されなかった場合でも、結果はr.Next()の元の値であり、 nilではありません)。
rとsが異なるリングを指している場合、それらをリンクすると sの要素がrの後ろに挿入された1つのリングが作成されます。 結果は、挿入後のsの最後の要素の次の要素を指します。
Example ¶
package main
import (
"github.com/shogo82148/std/container/ring"
"github.com/shogo82148/std/fmt"
)
func main() {
// サイズ2の2つのリングrとsを作成します。
r := ring.New(2)
s := ring.New(2)
// リングの長さを取得します。
lr := r.Len()
ls := s.Len()
// rを0で初期化します。
for i := 0; i < lr; i++ {
r.Value = 0
r = r.Next()
}
// sを1で初期化します。
for j := 0; j < ls; j++ {
s.Value = 1
s = s.Next()
}
// リングrとリングsを連結します。
rs := r.Link(s)
// 連結されたリングを走査して内容を出力します。
rs.Do(func(p any) {
fmt.Println(p.(int))
})
}
Output: 0 0 1 1
func (*Ring) Move ¶
Moveは、リング内を n % r.Len() 個ぶん、後方へ(n < 0)または前方へ (n >= 0)移動し、そのリング要素を返します。rは空であってはなりません。
Example ¶
package main
import (
"github.com/shogo82148/std/container/ring"
"github.com/shogo82148/std/fmt"
)
func main() {
// サイズ5の新しいリングを作成します。
r := ring.New(5)
// リングの長さを取得します。
n := r.Len()
// リングにいくつかの整数値を設定します。
for i := 0; i < n; i++ {
r.Value = i
r = r.Next()
}
// ポインタを3ステップ進めます。
r = r.Move(3)
// リングを走査して内容を出力します。
r.Do(func(p any) {
fmt.Println(p.(int))
})
}
Output: 3 4 0 1 2
func (*Ring) Next ¶
Nextは次のリング要素を返します。rは空であってはなりません。
Example ¶
package main
import (
"github.com/shogo82148/std/container/ring"
"github.com/shogo82148/std/fmt"
)
func main() {
// サイズ5の新しいリングを作成します。
r := ring.New(5)
// リングの長さを取得します。
n := r.Len()
// リングにいくつかの整数値を設定します。
for i := 0; i < n; i++ {
r.Value = i
r = r.Next()
}
// リングを走査して内容を出力します。
for j := 0; j < n; j++ {
fmt.Println(r.Value)
r = r.Next()
}
}
Output: 0 1 2 3 4
func (*Ring) Prev ¶
Prevは前のリング要素を返します。rは空であってはなりません。
Example ¶
package main
import (
"github.com/shogo82148/std/container/ring"
"github.com/shogo82148/std/fmt"
)
func main() {
// サイズ5の新しいリングを作成します。
r := ring.New(5)
// リングの長さを取得します。
n := r.Len()
// リングにいくつかの整数値を設定します。
for i := 0; i < n; i++ {
r.Value = i
r = r.Next()
}
// リングを逆方向に走査して内容を出力します。
for j := 0; j < n; j++ {
r = r.Prev()
fmt.Println(r.Value)
}
}
Output: 4 3 2 1 0
func (*Ring) Unlink ¶
Unlinkは、r.Next()から始まるリングrの n % r.Len() 個の要素を削除します。 n % r.Len() == 0 の場合、rは変更されません。 結果は削除されたサブリングです。rは空であってはなりません。
Example ¶
package main
import (
"github.com/shogo82148/std/container/ring"
"github.com/shogo82148/std/fmt"
)
func main() {
// サイズ6の新しいリングを作成します。
r := ring.New(6)
// リングの長さを取得します。
n := r.Len()
// リングにいくつかの整数値を設定します。
for i := 0; i < n; i++ {
r.Value = i
r = r.Next()
}
// rから3つの要素を切り離します。開始位置はr.Next()です。
r.Unlink(3)
// 残ったリングを走査して内容を出力します。
r.Do(func(p any) {
fmt.Println(p.(int))
})
}
Output: 0 4 5