Skip to content

Maybe add mp_set_find #89

Open
Open

Description

@rolandschulz

In cases a list is a set it is possible to do mp_find quicker. Is it worth to add this?

template <class S>
using mp_enumerate = mp_transform<mp_list, S, mp_iota<mp_size<S>>>;
template <class S, class V>
using mp_set_find = mp_second<mp_map_find<mp_enumerate<S>, V>>;

Activity

  1. pdimov commented on Jan 7, 2024

    @pdimov
    Member

    Probably makes sense for completeness. I wonder what's the actual difference in performance in 2024 compared to mp_find, though.

  2. rolandschulz commented on Jan 8, 2024

    @rolandschulz
    Author

    The speedup isn't huge with modern gcc/clang. With icx 2024.1 I get for

    using S = mp_iota_c<100>;
    
    template <class S>
    using mp_enumerate = mp_transform<mp_list, S, mp_iota<mp_size<S>>>;
    
    using E = mp_enumerate<S>;
    
    template <class S, class V>
    using mp_set_find = mp_second<mp_map_find<E, V>>;
    // using mp_set_find = mp_find<S,V>;
    
    template<class A, class B> using F = mp_less<mp_set_find<S, A>, mp_set_find<S, B>>;
    static_assert(std::is_same_v<mp_sort<S, F>, S>);

    1.6s for mp_set_find and 2.2s for mp_find.

  3. pdimov commented on Jan 8, 2024

    @pdimov
    Member

    I think this is an improvement that justifies having mp_set_find.

    I'd like to add mp_enumerate as well, but most other languages (and std::views::enumerate) put the index first, not second. (Which is actually what mp_at uses.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions