Динамо-машины  Метод Сократа 

1 2 3 4 5 [ 6 ] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

ни {Kevlin Henney), Говарду Хиннанту (Howard Hinnant), Кэю Хорстману (Cay Horstmann), Джиму Хайслопу (Jim HysJop), Марку Камииски (Mark Е. Kaminsl lt;y), Дэинису Манклу (Dennis Mancl), Брайену Мак-Намара (Brian McNamara), Скотту Мейерсу (Scott Meyers), Джеффу Пейлу (Jeff Peil), Джону Поггеру (John Potter), П. Плагеру (Р. J. Plauger), Мартину Себору (Martin Sebor), Джеймсу Слотеру (James Slaughter), Николаю Смирнову (Nikolai Smirnov), Джону Спайсеру (John Spicer), Яну Кристиану ван Винклю (Jan Chrisliaan van Winkel), Дэвиду Вандевурду (Daveed Vande-voordc) и Биллу Всйду (Bill Wade). Все оставшиеся в книге ошибки, описки и неточности - только на моей совести.

Еще одна благодарность - нашему щенку Франки (Frankie), который оттаскивал меня от стола и тащил дышать свежим воздухом, без чего, конечно, моя работа никогда не была бы закончена. Замечу, что Франки ничего не знает о программировании, оптимизации, архитектуре программного обеспечения, и при этом он всегда выглядит счастливым и довольным. Над этим стоит задуматься...

Герб Cammep (Herb Sutter) Сиэтл, май 2004

От издательства

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

Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумажное или электронное письмо, либо просто посетить наш Wcb-ссрвер и оставить свои замечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится или нет вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас.

Посылая письмо или сообщение, не забудьте указать название книги и се авторов, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию последующих книг. Наши координаты:

E-mail: inf oowilliamspublishlng . com

WWW: http : www . will iamspubl ishing . com

Информация для писем из: России: 115419, Москва, а/я 783

Украины: 03150, Киев, а/я 152



Обобщенное программирование и стандартная библиотека с++

Одной из наиболее мощных возможностей С++ является поддержка обобщенного программирования. Эта возможность находит непосредственное отражение в гибкости стандартной библиотеки С++, в особенности в контейнерах, итераторах и алгоритмах, известных под названием стандартной библиотеки шаблонов (Standard Template Library - STL).

Так же, как и предыдущая книга [Sutter02], эта книга начинается с задач, которые привлекают наше внимание к некоторым хорошо знакомым частям STL, в частности к векторам и строкам. Сможете ли вы избежать широко распространенных ловушек при использовании такого базового контейнера STL, как вектор? Как вы вьшолните обычные манипуляции со строками в С++? Какие уроки в плане конструирования библиотек вы сможете извлечь для себя из STL?

После того как мы разберемся с предопределенными шаблонами STL, мы обратимся к более общим вопросам, связанным с шаблонами и обобщенным программированием на С+ + . Как можно избежать при разработке собственного шаблонного кода его необобщенности? Почему специализация шаблонов функций - не лучшая идея, и что следует делать вместо этого? Как корректно и переносимо добиться тех же результатов, которые дают отношения дружественности? И что нам дает ключевое слово export?

Эти и другие вопросы будут рассмотрены нами в разделе, посвященном обобщенному программированию и стандартной библиотеке С++.



Задача 1. Вектор: потребление

и злоупотребление Сложность: 4

Почти все используют std:: vector, и это хорошо. К сожалению, многие не всегда верно понимают его семантику и в результате невольно применяют его странными, а порой и опасными способами. Сколько из перечисленных ниже проблем можно найти в ваших программах?

Вопрос для новичка

1. В чем разница между строками А и В?

void fС vector lt;int gt; amp; v ) {

v[0]; A

v.at(O); В

Вопрос для профессионала

2. Рассмотрим следующий код. vector lt;int gt; v;

V. reserveC 2 ) ;

assertC v.capacityO == 2 );

v[0] = 1;

v[l] = 2;

for(vector lt;int gt;::i terator i = v.beginC); i lt;v.end(); i++){ cout laquo; *i laquo; endl;

cout laquo; v[0];

V.reserveC 100 );

assertC V.capacityO == 100 );

cout laquo; v[0];

v[2] = 3; v[3] = 4;

v[99i = 100;

for( vector lt;int gt;::iterator i = v.beginC); i lt;v.end(); i++){ cout laquo; *i laquo; endl;

Раскритикуйте этот код, как с точки зрения стиля, так и с точки зрения корректности.

Решение

Обращение к элементу вектора

1. В чем разница между строками А и В?

void f( vector lt;int gt; amp; v ) {

v[0]; A

v.at(O); в



1 2 3 4 5 [ 6 ] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90