Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2024-12-21 12:11:19


Christian Mazakas wrote:
> I'm with Andrey, I think the iterator API *is* the useful API. Typically, when I
> find something in a map, I'll either erase or do something else where reusing
> the iterator is a key part of everything.
>
> My whole thing was about what users actually wanted vs all the costs of
> everything else.

What this user has always wanted is to not have to write this:

  auto it = map.find( key );
  if( it != map.end() )
  {
    // do something with it->second
  }

That's why I'm always defining a helper function `lookup` that returns a
pointer, which allows me to write this instead:

  if( auto p = lookup( map, key ) )
  {
    // do something with *p
  }

If there's a built-in way to obtain an optional<mapped_type&> instead
of an iterator, I can use that instead of `lookup`, without changing the
syntax.

Although it strikes me that it should probably be named `try_at` instead
of `try_find`. `find` is already a try-ing member function, because it doesn't
fail, whereas `at` both returns the correct reference type, and can fail.

Of course `try_at` by convention ought to return boost::system::result
or std::expected instead of an optional, but that's another story.

Interestingly, and maybe relevant for this discussion, `at` was added to
associative containers even though it could have been made a free
function instead.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk