ring

package
v1.26.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 16, 2026 License: MIT Imports: 0 Imported by: 0

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 New

func New(n int) *Ring

Newはn個の要素からなるリングを作成します。

func (*Ring) Do

func (r *Ring) Do(f func(any))

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

func (r *Ring) Len() int

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 (r *Ring) Link(s *Ring) *Ring

Linkはリングrとリングsを接続し、r.Next()がsになるようにして、 r.Next()の元の値を返します。rは空であってはなりません。

rとsが同じリングを指している場合、それらをリンクすると rとsの間の要素がリングから削除されます。削除された要素は サブリングを形成し、結果はそのサブリングへの参照になります (要素が削除されなかった場合でも、結果はr.Next()の元の値であり、 nilではありません)。

rとsが異なるリングを指している場合、それらをリンクすると sの要素がrの後ろに挿入された1つのリングが作成されます。 結果は、挿入後のsの最後の要素の次の要素を指します。

func (*Ring) Move

func (r *Ring) Move(n int) *Ring

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

func (r *Ring) Next() *Ring

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

func (r *Ring) Prev() *Ring

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 (r *Ring) Unlink(n int) *Ring

Unlinkは、r.Next()から始まるリングrの n % r.Len() 個の要素を削除します。 n % r.Len() == 0 の場合、rは変更されません。 結果は削除されたサブリングです。rは空であってはなりません。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL