|
Программирование >> Немодифицирующие последовательные алгоритмы
cin.clear(); getaline(cin, str); 1 break; cin.getO; пропустить пробел; getaline(cin, str); D[str] = nr; 1 break; case *: for (i = D.beginO; i != D.endO; i++) cout setw(9) (*i).second (*i).first endl; break; case = : ofstr.open( phone.txt ); if (ofstr) { for (i = D.beginO; i != D.endO; i++) ofstr setw(9) (*i).second (*i).first endl; ofstr.close(); } else cout Cannot open output file.\n ; break; case #: break; default: cout Use: * (list), ? (find), = (save), / (delete), ! (insert), or # (exit).\n ; getaline(cin, str); break; ! if (ch == #) break; int mainO { directype D; Readlnput(D); ShowCommands(); ProcessCommands(D) ; return 0; ! Поскольку поведение этой программы не отличается от поведения начальной версии, mapl.cpp, опустим пример ее работы. Эта версия проще в том отношении, что мы оперируем с объектами класса string таким же образом, как со встроенными типами, например int, несмотря на различные длины строк. Так как память для этих строк размещается и освобождается автоматически, в программе не встречаются операторы new и delete. Последовательные контейнеры 3.1. Векторы и связанные с ними типы Когда идет речь о шаблонах вообш;е и STL в частности, новички бывают сбиты с толку сложным синтаксисом этих выражений. Мы начнем с обсуждения синтаксиса, приводя примеры, которые не всегда имеют практическое значение, но полезны тем, что позволяют в нем разобраться. Во второй главе книги мы использовали тип valuejtype при работе с ассоциативными контейнерами. Он определен также для последовательных контейнеров. В классе vector указанный тип определен достаточно простым способом: typedef Т value type; в то время как в классе тар определение этого типа следующее: typedef pair<const Key, Т> value type; В любом случае мы видим, что valuejtype означает тип элементов, содержащихся в контейнере. Поскольку его определение находится внутри рассматриваемого класса, при использовании в другом контексте мы должны квалифицировать имя valuetype, например таким образом: vector<int>::value type; Из предыдущего обсуждения следует, что эта усложненная запись обозначает просто тип int. Другими словами, если мы используем заголовок vector, то можем заменить строчку int к; vector<int>::value type к; Вряд ли эта форма более удобна, но отсюда видно, что запись vector<int>:.-value type не содержит ничего мистического. Перечисленные ниже типы могут быть использованы точно таким же образом, как типы, определенные одним идентификатором: vector<int>::iterator vector<int>::reverse iterator vector<int>::const iterator vector<int>::const reverse iterator Вспомним, что мы рассматривали первые три из этих четырех типов в разделах 1.2 и 1.3. Четвертый, очевидно, может быть использован для прохождения контейнера в обратном порядке без изменения его элементов. Например, после typedef vector<int>::iterator VecIntlterType; мы можем заменить vector<int>::iterator i; на более простое выражение VecIntlterType i; Вот полный список вложенных типов: value type reference, const reference iterator, const iterator reverse iterator, const reverse iterator difference type size type vector allocator Их имена хорошо объясняют их назначение. Нам потребуется большинство из этих типов при обсуждении функций-членов контейнеров. Далее рассмотрим два оператора доступа по индексу для векторов, которые могут быть объявлены в шаблоне vector следующим образом:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |