Стандарты программирования на С++



         

Примеры


Пример. FlagNth. Перед вами классический пример из [Sutter02], в котором выполняется попытка удалить третий элемент из контейнера v.

class FlagNth { public: FlagNth( size_t n ) : current_(0), n_(n) { }

// Возвращаем значение true только при третьем вызове template<typename T> bool operator()( const T& ) // Плохо: неконстантная { return ++current_ == n_; } // функция private: size_t current_, n_; };

// ... позже ... v.erase( remove_if( v.begin(), v.end(), FlagNth(3) ) );

Увы, нет никакой гарантии, что будет удален именно третий элемент В большинстве реальных реализаций STL приведенный код наряду с третьим удалит и шестой элемент. Почему? Потому что remove_if обычно реализуется с использованием find_if и remove_copy_if, и копия предиката передается каждой из этих функций.

Концептуально этот пример неверен, поскольку алгоритм remove_if гарантирует только то, что он удалит все элементы, удовлетворяющие некоторому критерию. Он не документирует порядок, в котором совершается обход или удаление элементов из обрабатываемого диапазона, так что приведенный код использует предположение, которое не документировано и, более того, не выполняется.

Корректный способ удаления третьего элемента — выполнить итерации для его поиска и вызвать функцию erase.




Содержание  Назад  Вперед