madf: (Default)
[personal profile] madf
Мабуть всі C++-програмісти знають про те що насправді робить алгоритм std::remove_if. Що він нічого не видаляє а лише переміщує елементи послідовності для яких предикат істинний у кінець послідовності. Звісно для цього він використовує swap і, як наслідок, operator=.
Але, мабуть, не всі знають про те як працює метод std::list::remove_if. Як мінімум, він має зовсім іншу сигнатуру:
template<typename _Predicate>
void
remove_if(_Predicate);
_Winnie C++ Colorizer

А найголовніше те, що він видаляє із списку елементи для яких предикат істинний!
Це для мене було великим сюрпризом. Я очікував поведінки схожої з узагальненим алгоритмом, за виключенням того що swap оперує не значеннями елементів а вказівниками (це ж список).
В принципі, така поведінка мене цілком влаштовує. Я засунув operator= глибоко в private, а конструктор копії обвішав assert'ами (твердженнями?) бо він мені таки потрібний. Код працює, не сегфолтить і не вивалюється з assertion failed.

Profile

madf: (Default)
madf

April 2018

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 8th, 2026 05:46 am
Powered by Dreamwidth Studios