В этой книге известный автор Скотт Мейерс
раскрывает секреты настоящих мастеров, позволяющие добиться максимальной
эффективности при работе с библиотекой STL. Во многих книгах описываются
возможности STL, но только в этой рассказано о том, как работать с этой
библиотекой. Каждый из 50 советов книги подкреплен анализом и убедительными
примерами, поэтому читатель не только узнает, как решать ту или иную задачу, но
и когда следует выбирать то или иное решение — и почему именно такое.
Содержание
Предисловие
Благодарности
Введение
Определение, использование и расширение STL Ссылки STL и Стандарты Подсчет ссылок string и wstring Терминология Примеры Вопросы эффективности Рекомендации
Глава 1 Контейнеры
Совет 1. Внимательно подходите к выбору контейнера Совет 2. Остерегайтесь иллюзий контейнерно-независимого кода Совет 3. Реализуйте быстрое и корректное копирование объектов в контейнерах Совет 4. Вызывайте empty вместо сравнения size() с нулем Совет 5. Используйте интервальные функции вместо одноэлементных Совет 6. Остерегайтесь странностей лексического разбора C++ Совет 7. При использовании контейнеров указателей, для которых вызывался оператор new, не забудьте вызвать delete для указателей перед уничтожением контейнера Совет 8. Никогда не создавайте контейнеры, содержащие auto_ptr Совет 9. Тщательно выбирайте операцию удаления Совет 10. Помните о правилах и ограничениях распределителей памяти Совет 11. Учитывайте область применения пользовательских распределителей памяти Совет 12. Разумно оценивайте потоковую безопасность контейнеров STL
Глава 2 Контейнеры vector и string
Совет 13. Используйте vector и string вместо динамических массивов Совет 14. Используйте reserve для предотвращения лишних операций перераспределения памяти Совет 15. Помните о различиях в реализации string Совет 16. Научитесь передавать данные vector и string функциям унаследованного интерфейса Совет 17. Используйте "фокус с перестановкой" для уменьшения емкости Совет 18. Избегайте vector<bool>
Глава 3 Ассоциативные контейнеры
Совет 19. Помните о различиях между равенством и эквивалентностью Совет 20. Определите тип сравнения для ассоциативного контейнера, содержащего указатели Совет 21. Следите за тем, чтобы функции сравнения возвращали false в случае равенства Совет 22. Избегайте изменения ключа "на месте" в контейнерах set и multiset Совет 23. Рассмотрите возможность замены ассоциативных контейнеров сортированными векторами Совет 24. Тщательно выбирайте между map::operator[] и map::insert Совет 25. Изучите нестандартные хэшированные контейнеры
Глава 4 Итераторы
Совет 26. Старайтесь использовать iterator вместо const_iterator, reverse_iterator и const_reverse_iterator Совет 27. Используйте distance и advance для преобразования const_iterator в iterator Совет 28. Научитесь использовать функцию base Совет 29. Рассмотрите возможность использования istreambuf_iterator при посимвольном вводе
Глава 5 Алгоритмы
Совет 30. Следите за тем, чтобы приемный интервал имел достаточный размер Совет 31. Помните о существовании разных средств сортировки Совет 32. Сопровождайте вызовы remove-подобных алгоритмов вызовом erase Совет 33. Будьте внимательны при использовании remove-подобных алгоритмов с контейнерами указателей Совет 34. Помните о том, какие алгоритмы получают сортированные интервалы Совет 35. Реализуйте простые сравнения строк без учета регистра символов с использованием mismatch или lexicographical_compare Совет 36. Правильно реализуйте copy_if Совет 37. Используйте accumulate или for_each для обобщения интервальных данных
Глава 6 Функции, функторы и классы функций
Совет 38. Проектируйте классы функторов для передачи по значению Совет 39. Реализуйте предикаты в виде "чистых" функций Совет 40. Классы функторов должны быть адаптируемыми Совет 41. Разберитесь, для чего нужны ptr_fun, mem_fun и mem_fun_ref Совет 42. Следите за тем, чтобы конструкция less <T> означала operator <
Глава 7 Программирование в STL
Совет 43. Используйте алгоритмы вместо циклов Совет 44. Используйте функции контейнеров вместо одноименных алгоритмов Совет 45. Различайте алгоритмы count, find, binary_search, lower_bound, upper_bound и equal_range Совет 46. Передавайте алгоритмам объекты функций вместо функций Совет 47. Избегайте "нечитаемого" кода Совет 48. Всегда включайте нужные заголовки Совет 49. Научитесь читать сообщения компилятора Совет 50. Помните о web-сайтах, посвященных STL Сайт SGI STLСайт STLportСайт Boost
Литература
Книги, написанные мной Книги, написанные другими авторами Ошибки и опечатки
Приложение А. Локальные контексты
Сравнение строк без учета регистра символов Первая попытка Локальный контекст Локальные контексты в C++ Фасет collate Сравнение строк без учета регистра
Приложение Б. Замечания по поводу платформ STL от Microsoft
Шаблоны функций классов в STL MSVC версий 4-6 Обходное решение для MSVC4-5 Обходное решение для MSVC6
Алфавитный указатель
Комментарии
Игорь Сухов
Русский перевод (оценим его, как неплохой) 3-й книги из эффективной серии Скотта Мейерса, в отличие от
первых двух (Эффективное использование С++ и Наиболее эффективное использование С++),
опоздал от западного
издания всего на один год, что уже не может не радовать. Стиль и качество изложения сохранились -
быстро (иногда не заглядывая глубоко в тему) и непринужденно.
Повышение производительности, неочевидная (и побочная) функциональность некоторых алгоритмов/контейнеров STL - вот
на чем автор останавливается наиболее подробно, и как мне кажется, не зря. В общем - must read.
Валерий Лаптев
Эту книгу можно купить уже только за то, что ее написал Скотт Мейерс.
Мне его книжки очень по вкусу, и эта - не исключение. Как все книги
Мейерса, книга написана в виде советов. Это книга - не для начинающего
программиста, надо уже довольно хорошо представлять, что такое
стандартная библиотека. Однако вот такой парадокс: если программист
достаточно опытен в использовании STL, то книга Мейерса ему тоже не
нужна.
В качестве примера можно привести совет 22 "Избегайте изменения ключа
"на месте" в контейнерах set и multiset". Начинающему такой совет
ничего не говорит, а опытный и так знает, что такие действия "выходят
боком". А вот для того программиста, который множествами уже
попользовался, но тонкостей еще не знает, в этом совете может найтись
полезная информация.
Уровень (скажем так) советов в этой книге я бы определил "после
начинающего". Если начинающий - это программист, первый раз решивший
использовать STL, он должен сначала просто изучить состав и основные
принципы построения STL. Для этого книга Мейерса подходит плохо -
состав и принципы надо изучать по книге Джосаттиса, а первый проект
выполнять по книге Халперна. А вот если программист делает второй,
максимум - третий проект с помощью STL, то книга - в самый раз.
Однако и для начинающих, и для опытных программистов в книге найдутся
некоторые полезные сведения. Для начинающих - это конечно совет 50,
где описаны сайты с бесплатными библиотеками STL: SGI, STLport и
boost. Опытным программистам тоже найдется что прочитать: статья Мэтта
Остерна о локалях и фасетах.
Перевод - неплохой, хотя встречаются опечатки и погрешности.