On Thu, May 29, 2025 at 3:56 PM Patrick Palka <ppa...@redhat.com> wrote:

> Tested on x86_64-pc-linux-gnu, does this look OK for trunk/15?
>
> -- >8 --
>
> Instead of effectively doing a zipped comparison of the keys and values,
> compare them separately to leverage the underlying containers' optimized
> equality implementations.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/flat_map (_Flat_map_impl::operator==): Compare
>         keys and values separately.
> ---
>  libstdc++-v3/include/std/flat_map | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/include/std/flat_map
> b/libstdc++-v3/include/std/flat_map
> index c0716d12412a..134307324190 100644
> --- a/libstdc++-v3/include/std/flat_map
> +++ b/libstdc++-v3/include/std/flat_map
> @@ -873,7 +873,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>        [[nodiscard]]
>        friend bool
>        operator==(const _Derived& __x, const _Derived& __y)
> -      { return std::equal(__x.begin(), __x.end(), __y.begin(),
> __y.end()); }
> +      {
> +       return __x._M_cont.keys == __y._M_cont.keys
> +         && __x._M_cont.values == __y._M_cont.values;
>
Previously we supported containers that do not have operator==, by calling
equal.
For the flat_set we also do not compare the containers. I would suggest
using in both:
  ranges::equal(x._M_cont)
Or using == on containers in both flat_map and flat_set.

> +      }
>
>        template<typename _Up = value_type>
>         [[nodiscard]]
> --
> 2.50.0.rc0
>
>

Reply via email to