Check out https://pkg.go.dev/github.com/liyue201/gostl@v1.2.0/algorithm/sort 
<https://pkg.go.dev/github.com/liyue201/gostl@v1.2.0/algorithm/sort> but you 
could just as easily write those functions - they’re fairly trivial.

Almost all of the C++ STL is implemented.

> On Oct 10, 2024, at 3:50 PM, 'lijh8' via golang-nuts 
> <golang-nuts@googlegroups.com> wrote:
> 
> 
> Are there alternatives to lower & upper bound or partition_point 
> 
> Suppose there duplicate entries in a slice.
> I need to use a loop to find out the upper bound on a sorted slice.
> 
> Are there something similar to c++ lower_bound, upper_bound, partition_point?
> 
> Thanks
> 
> ```
> 
> package main
> 
> import (
>     "slices"
>     "tuple2"
> )
> 
> type S struct {
>     name string
>     num  int
> }
> 
> func cmp(a, b S) int {
>     x := []any{a.name, a.num}
>     y := []any{b.name, b.num}
>     z, _ := tuple2.Compare(x, y)
>     return z
> }
> 
> func main() {
>     haystack := []S{
>         {"aaa", 10},
>         {"bbb", 20},
>         {"ccc", 30},
>         {"bbb", 20},
>         {"bbb", 20},
>     }
>     needle := S{"bbb", 20}
> 
>     slices.SortFunc(haystack, cmp)
> 
>     lower, _ := slices.BinarySearchFunc(haystack, needle, cmp)
> 
>     upper := lower
>     for i := lower; i != len(haystack); i++ {
>         x := []any{needle.name, needle.num}
>         y := []any{haystack[i].name, haystack[i].num}
>         z, _ := tuple2.Compare(x, y)
>         if z == -1 {
>             upper = i
>             break
>         }
>     }
> 
>     LOG(lower, upper)
> }
> 
> ```
> 
> ```
> 
> package tuple2
> 
> import (
>     "cmp"
>     "reflect"
> )
> 
> // two tuples should be the same length and
> // element types are same for same position.
> func Compare(a, b []any) (int, bool) {
>     if len(a) != len(b) {
>         return 0, false
>     }
> 
>     for i := range a {
>         if a[i] == nil || b[i] == nil {
>             return 0, false
>         }
> 
>         if _, boolean := a[i].(bool); boolean {
>             return 0, false
>         }
>         if _, boolean := b[i].(bool); boolean {
>             return 0, false
>         }
> 
>         if a, b := reflect.TypeOf(a[i]), reflect.TypeOf(b[i]); a != b {
>             return 0, false
>         }
> 
>         if a, aOk := a[i].(string); aOk {
>             if b, bOk := b[i].(string); bOk {
>                 if c := cmp.Compare(a, b); c != 0 {
>                     return c, true
>                 }
>             }
>         }
> 
>         if a, aOk := a[i].(int); aOk {
>             if b, bOk := b[i].(int); bOk {
>                 if c := cmp.Compare(a, b); c != 0 {
>                     return c, true
>                 }
>             }
>         }
> 
>         if a, aOk := a[i].(float64); aOk {
>             if b, bOk := b[i].(float64); bOk {
>                 if c := cmp.Compare(a, b); c != 0 {
>                     return c, true
>                 }
>             }
>         }
> 
>         if a, aOk := a[i].([]any); aOk {
>             if b, bOk := b[i].([]any); bOk {
>                 if c, ok := Compare(a, b); ok && c != 0 {
>                     return c, true
>                 } else if !ok {
>                     return 0, false
>                 }
>             }
>         }
>     }
>     return 0, true
> }
> 
> /*
> func main() {
>     a := []any{"abc", 123, 3.14}
>     b := []any{"abc", 123, 3.14}
>     c, ok := tuple2.Compare(a, b)
>     fmt.Println(c, ok)
> }
> */
> 
> ```
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts+unsubscr...@googlegroups.com 
> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/tencent_118EE485C4CA0D09E533048760E419034F0A%40qq.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/tencent_118EE485C4CA0D09E533048760E419034F0A%40qq.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/37745356-8AC0-4F2A-A15B-2A959D892A3C%40ix.netcom.com.

Reply via email to