Looking for std::map::erase_if

Russell L. Carter rcarter at pinyon.org
Sat Mar 20 18:13:32 UTC 2021


On 3/20/21 10:48 AM, Dimitry Andric wrote:
> Well, -std=c++20 even, it is that new. :)
> 
> That said, it's always hazardous to rely on experimental features, they are effectively unsupported.
> 
> As shown on e.g. cppreference.com, you can use an equivalent function that looks like:
> 
> auto old_size = c.size();
> for (auto i = c.begin(), last = c.end(); i != last; ) {
>    if (pred(*i)) {
>      i = c.erase(i);
>    } else {
>      ++i;
>    }
> }

-std=c++20 is the way I would go to future proof, as then eg
erase_if(std::map) is no longer experimental.  The potential
downside is then dealing with other oddball usages that are
deprecated in c++20 (or c++17, c++14).  If you fix these
upstream might be receptive to patches.

One other detail is the switch for slightly older clang++
or g++ is -std=c++2a, not -std=c++20.

Dimitry is right, cppreference.com is your friend for this.
Very easy to google your problem method/class and get to exactly
what you need in terms of std compatibility.

Russell



> -Dimitry
> 
>> On 20 Mar 2021, at 16:22, Alan Somers <asomers at FreeBSD.org> wrote:
>>
>> I'm just guessing, but I think you should remove the "experimental" and
>> build with -std=c++17 .
>> -Alan
>>
>> On Sat, Mar 20, 2021 at 9:06 AM Willem Jan Withagen <wjw at digiware.nl> wrote:
>>
>>> On 20-3-2021 15:46, Alan Somers wrote:
>>>
>>> It looks like it's in there.  What code are you trying that doesn't work?
>>>
>>> Hi Alan,
>>>
>>> I thought so too, but all tries last 2 weeks did not result into anything
>>> that got it compiling...
>>> But could be that I did not try hard enough, real work is pulling a lot
>>> atm.
>>>
>>> Code is at:
>>>
>>> https://github.com/dillaman/ceph/blob/138d71fb0635682510cadda8e4ad5aaab3f39e44/src/librbd/api/Trash.cc#L299
>>>
>>> Thanx,
>>> --WjW
>>>
>>>
>>>> grep erase_if  /usr/include/c++/v1/map
>>>   void erase_if(map<Key, T, Compare, Allocator>& c, Predicate pred);  //
>>> C++20
>>>   void erase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred);
>>> // C++20
>>> void erase_if(map<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred)
>>> { __libcpp_erase_if_container(__c, __pred); }
>>> void erase_if(multimap<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate
>>> __pred)
>>> { __libcpp_erase_if_container(__c, __pred); }
>>>
>>> On Sat, Mar 20, 2021 at 8:39 AM Willem Jan Withagen via freebsd-hackers <
>>> freebsd-hackers at freebsd.org> wrote:
>>>
>>>> Hi,
>>>>
>>>> [ Trying this on FBSD 12.2 ]
>>>>
>>>> In the Ceph code new code uses std::map::erase_if.
>>>> Which is in Linux imported from <experimental/map>
>>>>
>>>> Anybody suggestions on libraries to get something matching??
>>>>
>>>> Thanx,
>>>> --WjW
>>>> _______________________________________________
>>>> freebsd-hackers at freebsd.org mailing list
>>>> https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
>>>> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org
>>>> "
>>>>
>>>
>>>
>> _______________________________________________
>> freebsd-toolchain at freebsd.org mailing list
>> https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
>> To unsubscribe, send any mail to "freebsd-toolchain-unsubscribe at freebsd.org"
> 



More information about the freebsd-hackers mailing list