Скотт Мейерс - Эффективное использование STL

Здесь есть возможность читать онлайн «Скотт Мейерс - Эффективное использование STL» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: СПб., Год выпуска: 2002, ISBN: 2002, Издательство: Питер, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Эффективное использование STL: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Эффективное использование STL»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

В этой книге известный автор Скотт Мейерс раскрывает секреты настоящих мастеров, позволяющие добиться максимальной эффективности при работе с библиотекой STL.
Во многих книгах описываются возможности STL, но только в этой рассказано о том, как работать с этой библиотекой. Каждый из 50 советов книги подкреплен анализом и убедительными примерами, поэтому читатель не только узнает, как решать ту или иную задачу, но и когда следует выбирать то или иное решение — и почему именно такое.

Эффективное использование STL — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Эффективное использование STL», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

};

Предположим, класс BadPedicateиспользуется для исключения третьего объекта Widgetиз контейнера vector:

vector vw; // Создать вектор и заполнить его

… // объектами Widget

vww.erase( remove_if(vw.begin(),// Удалить третий объект Widget.

vw.end(), // связь между erase и remove_if

BadPredcate()), // описана в совете 32

vw.end());

Программа выглядит вполне разумно, однако во многих реализациях STL из вектора vwудаляется не только третий, но и шестой элемент!

Чтобы понять, почему это происходит, необходимо рассмотреть один из распространенных вариантов реализации remove_if. Помните, что эта реализация не является обязательной.

template

FwdIterator remove_if(FwdIterator begin, FwdIterator end, Predicate p) {

begin = find_if(begin, end, p);

if (begin==end) return begin;

else {

FwdIterator next=begin;

return remove_copy_if(++next, end, begin, p);

}

}

Подробности нас сейчас не интересуют. Обратите внимание: предикат pсначала передается find_if, а затем remove_copy_if. Конечно, в обоих случаях pпередается по значению — то есть копируется (теоретически возможны исключения, но на практике дело обстоит именно так; за подробностями обращайтесь к совету 38).

Первый вызов remove_if(расположенный в клиентском коде, удаляющем третий элемент из vw) создает анонимный объект BadPredcateс внутренней переменной timesCalled, равной 0. Этот объект, известный в remove_ifпод именем p, затем копируется в find_if, поэтому find_ifтоже получает объект BadPredicateс переменной timesCalled, равной 0. Алгоритм find_if«вызывает» этот объект, пока тот не вернет true; таким образом, объект вызывается три раза. Затем find_ifвозвращает управление remove_if. Remove_ifпродолжает выполняться и в итоге вызывает remove_copy_if, передавая в качестве предиката очередную копию p. Но переменная timesCalledобъекта pпо-прежнему равна 0! Ведь алгоритм find_ifвызывал не p, а лишь копию p. В результате при третьем вызове из remove_copy_ifпредикат тоже вернет true. Теперь понятно, почему remove_ifудаляет два объекта Widgetвместо одного.

Чтобы обойти эту лингвистическую ловушку, проще всего объявить функцию operator()с ключевым словом constв предикатном классе. В этом случае компилятор не позволит изменить переменные класса:

class BadPredicate:

public unary_function {

public:

bool operator()(const Widget&) const{

return ++timesCalled == 3; // Ошибка! Изменение локальных данных

} // в константной функции невозможно

};

Из-за простоты этого решения я чуть было не озаглавил этот совет «Объявляйте operator()константным в предикатных классах», но этой формулировки недостаточно. Даже константные функции могут обращаться к mutablе-переменным, неконстантным локальным статическим объектам, неконстантным статическим объектам класса, неконстантным объектам в области видимости пространства имен и неконстантным глобальным объектам. Хорошо спроектированный предикатный класс должен обеспечить независимость функций operator()и от этих объектов. Объявление константных функций operator()в предикатных классах необходимо для правильного поведения, но не достаточно. Правильно написанная функция operator()является константной, но это еще не все. Она должна быть «чистой» функцией.

Ранее в этом совете уже упоминалось о том, что всюду, где STL ожидает получить предикатную функцию, может передаваться либо реальная функция, либо объект предикатного класса. Этот принцип действует в обоих направлениях. В любом месте, где STL рассчитывает получить объект предикатного класса, подойдет и предикатная функция (возможно, модифицированная при помощи ptr_fun— см. совет 41). Теперь вы знаете, что функции operator()в предикатных классах должны быть «чистыми» функциями, поэтому ограничение распространяется и на предикатные функции. Следующая функция также плоха в качестве предиката, как и объекты, созданные на основе класса BadPredcate:

bool anotherBadPredicate(const Widget&, const Widget&) {

static int timesCalled = 0; // Нет! Нет! Нет! Нет! Нет! Нет!

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Эффективное использование STL»

Представляем Вашему вниманию похожие книги на «Эффективное использование STL» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Эффективное использование STL»

Обсуждение, отзывы о книге «Эффективное использование STL» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x