std::remove_if vs. std::list::remove_if
Dec. 12th, 2009 06:33 pmМабуть всі C++-програмісти знають про те що насправді робить алгоритм std::remove_if. Що він нічого не видаляє а лише переміщує елементи послідовності для яких предикат істинний у кінець послідовності. Звісно для цього він використовує swap і, як наслідок, operator=.
Але, мабуть, не всі знають про те як працює метод std::list::remove_if. Як мінімум, він має зовсім іншу сигнатуру:
А найголовніше те, що він видаляє із списку елементи для яких предикат істинний!
Це для мене було великим сюрпризом. Я очікував поведінки схожої з узагальненим алгоритмом, за виключенням того що swap оперує не значеннями елементів а вказівниками (це ж список).
В принципі, така поведінка мене цілком влаштовує. Я засунув operator= глибоко в private, а конструктор копії обвішав assert'ами (твердженнями?) бо він мені таки потрібний. Код працює, не сегфолтить і не вивалюється з assertion failed.
Але, мабуть, не всі знають про те як працює метод std::list::remove_if. Як мінімум, він має зовсім іншу сигнатуру:
template<typename _Predicate> void remove_if(_Predicate); |
| _Winnie C++ Colorizer |
А найголовніше те, що він видаляє із списку елементи для яких предикат істинний!
Це для мене було великим сюрпризом. Я очікував поведінки схожої з узагальненим алгоритмом, за виключенням того що swap оперує не значеннями елементів а вказівниками (це ж список).
В принципі, така поведінка мене цілком влаштовує. Я засунув operator= глибоко в private, а конструктор копії обвішав assert'ами (твердженнями?) бо він мені таки потрібний. Код працює, не сегфолтить і не вивалюється з assertion failed.