C++ Logo

std-proposals

Advanced search

Re: [std-proposals] Addition of std::contains to Simplify Container Value Checks

From: Sebastian Wittmeier <wittmeier_at_[hidden]>
Date: Tue, 2 Jan 2024 23:20:13 +0100
Hi Robert,   for a proposal you have to present all the raised points and more in a discussion section. So I recommend to individually go into those points here on this mailing list to get individual feedback instead of summarily state to want to make it simple.   The final result may be simple, but the decisions and discussions and proposals for changing the standard seldom are (and with good reason).   With the current answer, one cannot even be sure you understand or integrated each raised feedback point, even if you write you understand the concerns, but it sounds more like a canned response, if I may say so (this is just a subjective feedback, no hard feelings, please).   Best regards, Sebastian   -----Ursprüngliche Nachricht----- Von:Robert Sitton via Std-Proposals <std-proposals_at_[hidden]> Gesendet:Di 02.01.2024 22:46 Betreff:Re: [std-proposals] Addition of std::contains to Simplify Container Value Checks An:std-proposals_at_[hidden]; CC:Robert Sitton <robert.sitton_at_[hidden]>; I fully understand the concerns that have been raised about the proposed std::contains function. However, it's important to emphasize that this function is specifically designed to simplify common coding tasks. While containers and ranges serve distinct purposes, having a unified std::contains function can greatly benefit developers by promoting code consistency and simplifying template code that works with various data structures.   The introduction of this function aligns with C++'s goal of providing standard, intuitive solutions for everyday programming tasks. It offers the flexibility to customize behavior when needed, making it a valuable addition to the C++ standard library (akin to std::find).  Sincerely,  Robert On Sun, Dec 24, 2023, 2:41 PM Jason McKesson via Std-Proposals <std-proposals_at_[hidden] <mailto:std-proposals_at_[hidden]> > wrote: On Sun, Dec 24, 2023 at 12:25 PM Giuseppe D'Angelo via Std-Proposals <std-proposals_at_[hidden] <mailto:std-proposals_at_[hidden]> > wrote: > > Il 24/12/23 14:50, Ville Voutilainen via Std-Proposals ha scritto: > > On Sun, 24 Dec 2023 at 15:44, Bjorn Reese via Std-Proposals > > <std-proposals_at_[hidden] <mailto:std-proposals_at_[hidden]> > wrote: > >> > >> On 12/23/23 10:20, Robert Sitton via Std-Proposals wrote: > >> > >>> Function Signature: > >>> template <typename Container, typename T> > >>> bool std::contains(const Container& container, const T& value); > >> > >> Why does it deviate from all other standard algorithms that takes > >> iterators (or ranges for std::ranges algorithms)? > > > > Because it doesn't operate on iterators. If you pass a std::map to it, > > it'll call std::map::contains, > > it doesn't perform a silly linear walk from one iterator to another. > > What we're looking at here is basically > > "call the argument's contains() if available, do a ranges::contains otherwise". > > Indeed; see also std::erase/erase_if, although for them there isn't even > a way to do the "otherwise" part -- the container must offer its own > overload, which effectively makes them customization points. > > My 2 c, The difference here is that what the "erase" functions do *fundamentally* cannot be done on a range. Ranges are sequences of elements, but they do not have a way to structurally manipulate the sequence of elements. The *contents* of those elements, yes. The actual sequence, no. As such, the "erase" class of functions do what the `remove` functions do, but they also include the container operations that actually get those elements out of the sequence. This is why they rely on the existence of member functions. That is not really the case for `contains`. Well it is, but it's also not. Like with "erase", what "contains" might do depends on the container itself. But unlike "erase", there is some reasonable, conceptual default functionality: search through the container in sequence for the item. But there are problems even with that. Associative container "contains" doesn't necessarily work like sequential container "contains" functions. And this is true at the API level. A sequential container "contains" function looks for equality with an element. An associative container "contains" function looks for "equality" with a *key* (or some type comparable with a key), not the actual value type. So it's really unclear to me when you would be in template code where you're not sure if you're working with an associative container or a sequential range. And that's ignoring that the equality for one isn't the equality for the other, as has been pointed out up-thread. No, this all just doesn't seem viable. ranges::contains is good enough for sequential searches for elements. If you need container-specific functionality, then you should know what the container is doing. -- Std-Proposals mailing list Std-Proposals_at_[hidden] <mailto:Std-Proposals_at_[hidden]> https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals -- Std-Proposals mailing list Std-Proposals_at_[hidden] https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals

Received on 2024-01-02 22:20:16