mp11 icon indicating copy to clipboard operation
mp11 copied to clipboard

Maybe add mp_set_find

Open rolandschulz opened this issue 1 year ago • 3 comments

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>>;

rolandschulz avatar Jan 07 '24 08:01 rolandschulz

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

pdimov avatar Jan 07 '24 15:01 pdimov

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.

rolandschulz avatar Jan 08 '24 01:01 rolandschulz

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.)

pdimov avatar Jan 08 '24 16:01 pdimov