Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 20 21 22 [ 23 ] 24 25 26 ... 78


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;



1 ... 20 21 22 [ 23 ] 24 25 26 ... 78

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