Гарантируется, что предикат remove_if будет вызываться только один раз на итератор?
Я читал последние спецификации C++, и я не могу понять, или нет remove_if
может вызываться несколько раз для одного и того же элемента. В частности, я смотрю на std::remove_if
быть призванным deque
итераторы. Насколько я могу судить, нет причин для его многократного вызова, если все, что он делает - просто начинает с первого параметра и повторяется до второго.
Код, над которым я работаю, использует ручной подсчет ссылок и, как таковой, на случай, если remove_if
Предикат вернет истину, уменьшит и удалит ссылку на базовый объект. Очевидная выгода в том, что это будет работать только в том случае, если remove_if
Предикат вызывается только один раз для каждого элемента, в противном случае последующие вызовы будут обращаться к удаленному объекту. Что-то говорит мне, что это не обязательно будет хорошо, и наступит момент, когда тот же элемент будет передан remove_if
дважды предикат для одного remove_if
вызов.
Если бы у вас была какая-то сумасшедшая структура данных, в которой реализованы итераторы, и, скажем, случайным образом выбирали запись для каждого приращения итератора до тех пор, пока она (случайно) не натолкнулась на конечный итератор, я мог видеть, как это не получится. Но для простых, стандартизированных структур, таких как deque
, vector
, а также list
Можно ли передать один элемент в предикат несколько раз?
1 ответ
Согласно проекту стандарта §23.3.4.6/14:
Сложность: Точно расстояние (начало (), конец ()) приложений соответствующего предиката.
Простите, если ссылка немного не в порядке; на самом деле это первое для меня официальное цитирование. Я надеюсь, что это информация, которую вы ищете.