Программирование >>  Обобщенные обратные вызовы 

1 ... 4 5 6 [ 7 ] 8 9 10 ... 84


Для простого форматирования, или при необходимости поддержки широких строк, или для использования в шаблонах выбирайте stringstream или strstream.

Для выполнения более сложного форматирования, если не требуется поддержка широких строк или использование в шаблонах, воспользуйтесь функцией snpri ntf. То, что это функция из С, вовсе не означает, что она не может быть использованной в С++!

Если проведенные измерения показывают, что проблема производительности действительно связана с использованием неэффективного метода форматирования, только в этом случае, только в этих конкретных местах кода имеет смысл воспользоваться одной из более быстрых альтернатив -- strstream или snprintf.

Никогда не используйте sprintf.

Таблица 3.1. Сравнение различных методов форматирования строк

sprintf

snprintf

stringstream

strstream

boost::lexical cast

Стандартность

[С90]

(распространенное расширение)

[C++03J

(распространенное расширение)

Да, но нежелательно

[С99]

С++{к

Вероятно

Вероятно

Возможно

(предположительно)

Простота использования

Простота

использования и

ясность?

Эффективность, без

излишних

распределений

памяти?

Безопасность в плане

переполнения буфера?

Безопасность типов?

Использование в

шаблонах?



Окончание табл. 3.1

sprintf

snprintf

stringst ream

strstrearr

boost: :!exicai cast

Время работы no отношению к .sprintf

Borland С++ 5.5.1 / Wi!idow,s

12.6

19.7

Gnu g++ 2.95.2 / Cygwin + Windows

Microsoft VC7 / Windows

13.2

19.2

Rogue Wave 2.1,1 / SunPro 5.3 / SunOS 5.7

16,5

Rogue Wave 2,2.1 / HP aCC 3.30/ HP-UX 11.00

Таблица 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. если контейнер содержит указатели на объекты.



1 ... 4 5 6 [ 7 ] 8 9 10 ... 84

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика