Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

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

Мейерс С. Эффективное использование STL. Библиотека программиста — Спб.: Питер , 2002. — 224 c.
ISBN 5-94723-382-7
Скачать (прямая ссылка): effektivnoeispolzovaniestlbibliote2002.djvu
Предыдущая << 1 .. 95 96 97 98 99 100 < 101 > 102 103 104 105 106 107 .. 114 >> Следующая

должна вернуть неконстантный итератор.
Взгляните еще раз. Да, объект nicknames объявлен как неконстантный тип
тар, но функция showEmail Address является константной, а внутри
константной функции все нестатические переменные класса становятся
константными! Таким образом, внутри showEmailAddress объект nicknames
является константным объектом тар. Сообщение об ошибке внезапно обретает
смысл. Мы пытаемся сгенерировать i terator для объекта тар, который
обещали не изменять. Чтобы исправить ошибку, необходимо либо привести i к
типу const_iterator, либо объявить showEmailAddress неконстантной
функцией. Вероятно, оба способа потребуют значительно меньших усилий, чем
выяснение смысла сообщения об ошибке.
В этом совете были показаны некоторые текстовые подстановки, уменьшающие
сложность сообщений об ошибках, но после непродолжительной практики вы
сможете выполнять подстановки в голове. Я не музыкант, но мне
рассказывали, что хорошие музыканты способны читать партитуру целиком, не
присматриваясь к отдельным нотам. Опытные программисты STL приобретают
аналогичные навыки. Они могут автоматически преобразовать конструкцию
вида std: :basic_string<char, std: :char_traits<char>,std::al 1
ocator<char> > в string, нисколько не задумываясь над происходящим.
Подобный навык разовьется и у вас, но до этих пор следует помнить, что
диагностику компилятора почти всегда можно привести к вразумительному
виду заменой длинных типов на базе шаблонов более короткими
мнемоническими обозначениями. Во многих случаях для этого достаточно
заменить расширенные определения типов именами, используемыми в
программе. Именно это было сделано в приведенном примере, когда мы
заменили std: :map<class string,class string,struct std::less<class
string>.class std::allocator<class string> > на NicknameMap.
Совет 49 197
Далее приведены некоторые рекомендации, которые помогут вам разобраться в
сообщениях компилятора, относящихся к STL.
• Для контейнеров vector и stri ng итераторы обычно представляют
собой указатели, поэтому в случае ошибки с итератором в диагностике
компилятора обычно указываются типы указателей. Например, если в исходном
коде имеется ссылка на vector<double>:: iterator, в сообщении почти
наверняка будет упоминаться указатель doubl е*. Исключение составляет
реализация STLport в отладочном режиме; в этом случае итераторы vector и
string не являются указателями. За информацией о STLport и отладочном
режиме обращайтесь к совету 50.
• Сообщения, в которых упоминаются back_insert_iterator,
front_insert_ i terator и i nsert_i terator, почти всегда означают, что
ошибка была допущена при вызове back_inserter, front_inserter или
inserter соответственно (back_inserter возвращает объект типа
back_insert_i terator, front_i nserter возвращает объект типа
front_insert_iterator, a inserter возвращает объект типа i nsert i
terator; за информацией об этих типах обращайтесь к совету 30). Если эти
функции не вызывались в программе, значит, они были вызваны из других
функций (косвенно или явно).
• Сообщения с упоминаниями binderlst и binder2nd обычно
свидетельствуют об ошибке при использовании bindlst и bind2nd (bindlst
возвращает объект типа binderlst, a bind2nd возвращает объект типа
binder2nd).
• Итераторы вывода (например, ostream_iterator и ostreambuf_iterator
- см. совет 29, а также итераторы, возвращаемые back_i nserter, front i
nserter и i nserter) выполняют свои операции вывода или вставки внутри
операторов присваивания, поэтому ошибки, относящиеся к этим типам
итераторов, обычно приводят к появлению сообщений об ошибке внутри
операторов присваивания, о которых вы и понятия не имеете. Чтобы понять,
о чем идет речь, попробуйте откомпилировать следующий фрагмент:
vector<string*> v: // Попытка вывода содержимого
copy(v.begiп().v.endO, // контейнера указателей string*
ostream_iterator<string>(cout."\n'')); // как объектов string
• Если полученное сообщение об ошибке исходит из реализации алгоритма
STL (то есть если код, в котором произошла ошибка, находится в <al
gorithm>), вероятно, проблема связана с типами, которые вы пытаетесь
передать этому алгоритму. Пример - передача итераторов неправильной
категории. Попробуйте откомпилировать следующий фрагмент:
list<int>::iterator i1,i2: // Передача двусторонних итераторов
sort(i1.i2); // алгоритму, которому необходимы итераторы
// произвольного доступа
• Если вы используете стандартный компонент STL (например, контейнер
vector или string, алгоритм for_each), а компилятор утверждает, что он
понятия не имеет, что имеется в виду, скорее всего, вы забыли включить
необходимый заголовочный файл директивой finclude. Как объясняется в
совете 48, эта проблема может нарушить работоспособность кода, успешно
компилировавшегося в течение некоторого времени, при переносе его на
другую платформу.
198 Глава 7 • Программирование в STL
Совет 50. Помните о web-сайтах, посвященных STL
Интернет богат информацией об STL. Если ввести в любой поисковой системе
Предыдущая << 1 .. 95 96 97 98 99 100 < 101 > 102 103 104 105 106 107 .. 114 >> Следующая