|
Программирование >> Обобщенные обратные вызовы
Для простого форматирования, или при необходимости поддержки широких строк, или для использования в шаблонах выбирайте stringstream или strstream. Для выполнения более сложного форматирования, если не требуется поддержка широких строк или использование в шаблонах, воспользуйтесь функцией snpri ntf. То, что это функция из С, вовсе не означает, что она не может быть использованной в С++! Если проведенные измерения показывают, что проблема производительности действительно связана с использованием неэффективного метода форматирования, только в этом случае, только в этих конкретных местах кода имеет смысл воспользоваться одной из более быстрых альтернатив -- strstream или snprintf. Никогда не используйте sprintf. Таблица 3.1. Сравнение различных методов форматирования строк
Таблица 3.2. Правила применения методов форматирования строк По умолчанию, когда эффективность не так важна Там, где эффективность важна, и профилирование подтверждает необходимость оптимизации Простое конвертирование в строковое представ.асние Простое форматирование .!Иоо работа с широкими строка.ми или в шаблонах Сложное форматирование при отсутствии необходимости в работе с широкими строками или в шаблонах boost: : 1 exi cal cast std:;stri ngstream или std::strstream snprintf std::strstream или snprintf std: :strstream или snprintf snpri ntf В заключение отмстим несколько интересных возможностей, предусмотренных в strstream. Не последняя из них -- возможность выбора .между использованием встроенного или предоставляемого программистом буфера. Его существенный технический недостаток состоит в определенной хрупкости , связанной с необходимостью использования завершения строки при помощи ends. Важный (назовем его социальным ) недостаток заключается в том, что следует учитьшать (пусть и небольшую) вероятность того, что в один прекрасный день и комитет по стандарту С+ + , и производитель вашего компилятора решат избавиться от strstream. Честно говоря, очень странно видеть такую хорошую вещь нежелательной. Как видим, даже в стандарте некоторые животные равнее других . Проводилось усреднение по трем запускам каждой программы, в которых выполнялось по 1 млн, вызовов кода соо~ветствующих примеров. Результаты мог>т зависеть от используемых версии компиляторов и опций компиляции Задача 4. Функции-члены стандартной библиотеки Сложность: 5 Повторное использование - это хорошо, но всегда ли допустимо использование возможностей стандартной библиотеки с ней самой? Вот небольшой пример, который может вас удивить. В нем рассматривается возможность стандартной библиотеки, которая может быть переносимо использована с любым вашим кодом, но только не с самой стандартной библиотекой. Вопрос для новичка 1. Что такое std: :mem fun? Когда можно использовать std: : meiii f un? Приведите пример. Вопрос для профессионала 2. Полагая, что в комментарии в приведенном коде все правильно, ответьте на вопрос: является ли приведенный код корректным и переносимым кодом С-+? Обоснуйте свой ответ. std::mem fun</*...*/>( &std::vector<int>::clear ) Решение Игры с mem fun 1. Что такое std: :mem fun? Когда можно использовать std: :mem fun? Приведите пример. Стандартньп-i адаптер mem fun позволяет нам использовать функции-члены в алгоритмах ставдартиой библиотеки и другом коде, который обычно работает с функциями, не явяяюпхимися членами класса (свободными функциями). Пусть, например, мь! имеем class Employee { publi с: int DoStandardRai se() { /...-/ } int Gi veStandardRai se( Employee& e ) { return e.DoStandardRaiseC); std::vector<Employee> emps; Мы >же привыкли писать, например, следующим образом. std: :for each( emps . begi п С) , emps .end() , &Gi veStandardRai se ) ; Ho что, если функции Gi veStandardRai se() не существует или по каким-то иным причинам нам надо вызвать функцию-член не;10средствсшю? Тогда мы можем написать следующий код. std::vector<Emplоуее> emps; std::for each(emps.begi nC), emps.end(), std : : rr.em f un ref (&Empl oyee : : DoStandardRai se)) ; Суффикс ref в конце mem fun ref - дань историческим тргипциям. Когда мы пишем код наподобие приведенного, мы просто должны помнить, что надо использовать mem fun ref, если имеем дело с обычным контейнером с объектами и for eath работает со ссылками на эти объекты, и использовать nem .fun. если контейнер содержит указатели на объекты.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |