|
Программирование >> Немодифицирующие последовательные алгоритмы
typedef map<int, double, less<int> > maptype; int main() { maptype S; maptype: : iterator i = S.endO; for (int k=l; k<=10; k++) i = S.insert(i, maptype::value type(k, 1.0/k)); i = S.find(4); cout (*i).second endl; Вывод: 0.25 return 0; Первый аргумент этой версии функции insert используется как подсказка, указывающая, где следует начинать поиск требуемой позиции. Вставка ускоряется, если новый элемент непосредственно следует за элементом, на который ссылается первый аргумент. В этом случае добавление элемента выполняется за постоянное время. Напротив, если первый аргумент ссылается на любой другой элемент, вставка все равно осуществляется правильно, но занимает время 0(log N), где N - количество элементов множества. 2.11. Удаление элементов словаря Для удаления элементов словаря имеются три функции-члена erase, объявленные следующим образом: void erase(iterator position); void erase(iterator first, iterator last); size type erase(const key type &x); Первую из этих функций мы использовали в разделе 2.9. Вторая функция дает возможность стереть все элементы заданного диапазона. Третью функцию использовать легче всего, потому что она требует знать значение ключа, а не итератора. Она возвращает О или 1, что соответствует числу удаленных элементов. Иными словами, если существует элемент с заданным ключом, функция вернет 1; если нет, она вернет 0. 2.12. Более удобные строки До сих пор мы использовали достаточно примитивный способ работы со строками. Например, в программе тар.срр нам необходимо было выполнить два оператора delete[] (*i).first; D.erase(i); чтобы удалить элемент множества, на который ссылался итератор г. Если мы забудем выполнить первый из этих операторов, это приведет к утечке памяти , потому что сама строка символов останется где-то в памяти (по адресу, который хранится в (*i).first) без какой-либо возможности использовать эту память после того, как будет выполнен второй из этих операторов. Способ работы со строками был реализован в духе С, а не С++. Ключами наших элементов словаря являлись указатели на область памяти, которая распределялась и освобождалась вручную. В проекте стандарта С++ определен библиотечный класс string, чтобы упростить манипуляции со строками и уменьшить возможности для совершения случайных ошибок. Класс string не является частью STL и сейчас поддерживается не всеми компиляторами. Иными словами, программы, использующие этот класс, на текущий момент не являются переносимыми. Но есть надежда, что ситуация изменится в будущем. Сейчас мы рассмотрим некоторые свойства класса string, который поддерживается как ВС5, так и VC5. Чтобы иметь возможность определять переменные класса string, необходимо использовать следующую строку Mnclude: ♦include <string> И на этот раз мы не вправе написать <string.h> вместо <string>. Если ваш компилятор не принимает этот заголовок, он может поддерживать заголовок bstring.h или cstring.h, который вы должны использовать в таком случае. Иногда эти заголовки нужно включать перед заголовками STL. После этого мы можем написать следующие операторы присваивания: string s, t ; s = ABC ; t = DEFGH ; s = t; s = DEFGH s = -A ; s = A Как показывает приведенный фрагмент, с правой стороны этих присваиваний может находиться значение одного из трех типов: string (как в S = f;); char* (как в s = ABC \); char (как в s = Л ;). То же относится и к оператору +=, применяющемуся для добавления второго операнда к концу первого, который должен принадлежать к типу string. string s, t( KLM ), u(t); s = , t = u = KLM S += t; S = KLM S += PQR ; S = KLMPQR S += А; S = KLMPQRW Этот фрагмент, кроме того, показывает, что мы можем инициализировать строку с помощью значения типа char* либо string. Существуют два других способа инициализации строк. Первый - указать повторитель; например, начальное значение s будет ЛЛЛЛ , если мы напишем string S(5, А); Второй способ - использовать два итератора, например: string t( V.beginO, v.endO), u(a, a+3) ; где V имеет тип vector<char>, a a является массивом символов, первые три элемента которого используются для инициализации и. Класс string имеет функцию-член c str(), возвращающую указатель типа const char*, который можно применить в выражениях со строками С. Например, после string s( АВ ); char а[10]; strcpy(а, s.c str()); мы имеем а[0] = -А-а[1] = В а[2] = -ХО Как в случае с вектором, мы можем получить текущий размер строки с помощью функции-члена size. Например, после определения s в вышеприведенном фрагменте имеем s.sizeO = 2 Есть много интересных способов работы со строками, некоторые из них используются в следующей программе: strdemo.cpp: Программа, демонстрирующая возможности класса string. #include <iostream> #include <string> using namespace std; int mainO { string s(5, -A), t( BC ), u;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |