Выбрать главу

if ( loc_cnt )

cout ',';

else ++loc_cnt;

cout '(' (*liter).first

',' (*liter).second ')';

++liter;

}

cout ")\n";

++iter;

}

cout endl;

}

Если наше отображение не содержит элементов, данная функция не нужна. Проверить, пусто ли оно, можно с помощью функции-члена size():

if ( text_map-size() )

display_map_text( text_map );

Но более простым способом, без подсчета элементов, будет вызов функции-члена empty():

if ( ! text_map-empty() )

display_map_text( text_map );

6.12.4. Словарь

Вот небольшая программа, иллюстрирующая построение отображения, поиск в нем и обход элементов. Здесь используются два отображения. Первое, необходимое для преобразования слов, содержит два элемента типа string. Ключом является слово, которое нуждается в специальной обработке, а значением – слово, заменяющее ключ. Для простоты мы задали пары ключ/значение непосредственно в тексте программы (вы можете модифицировать программу так, чтобы она читала их из стандартного ввода или из файла). Второе отображение используется для подсчета произведенных замен. Текст программы выглядит следующим образом:

#include map

#include vector

#include iostream

#include string

int main()

{

map string, string trans_map;

typedef map string, string ::value_type valType;

// первое упрощение:

// жестко заданный словарь

trans_map.insert( va1Type( "gratz", "grateful" ));

trans_map.insert( va1Type( "'em", "them" ));

trans_map.insert( va1Type( "cuz", "because" ));

trans_map.insert( va1Type( "nah", "no" ));

trans_map.insert( va1Type( "sez", "says" ));

trans_map.insert( va1Type( "tanx", "thanks" ));

trans_map.insert( va1Type( "wuz", "was" ));

trans_map.insert( va1Type( "pos", "suppose" ));

// напечатаем словарь

map string,string ::iterator it;

cout "Наш словарь подстановок: \n\n";

for ( it = trans_map.begin();

it != trans_map.end(); ++it )

cout "ключ: " (*it).first "\t"

"значение: " ("it).second "\n";

cout "\n\n";

// второе упрощение: жестко заданный текст

string textarray[14]={ "nah", "I", "sez", "tanx",

"cuz", "I", "wuz", "pos", "to", "not",

"cuz", "I", "wuz", "gratz" };

vector string text( textarray, textarray+14 );

vector string ::iterator iter;

// напечатаем текст

cout "Исходный вектор строк:\n\n";

int cnt = 1;

for ( iter = text-begin(); iter != text.end();

++iter,++cnt )

cout *iter ( cnt % 8 ? " " : "\n" );

cout "\n\n\n";

// map для сбора статистики

map string,int stats;

typedef map string,int ::value_type statsValType;

// здесь происходит реальная работа

for ( iter=text.begin(); iter != text.end(); ++iter )

if (( it = trans_map.find( *iter ))

!= trans_map.end() )

{

if ( stats.count( *iter ))

stats [ *iter ] += 1;

else stats.insert( statsVa1Type( *iter, 1 ));

*iter = (*it).second;

}

// напечатаем преобразованный текст

cout "Преобразованный вектор строк:\n\n";

cnt = 1;

for ( iter = text.begin(); iter != text.end();

++iter, ++cnt )

cout *iter ( cnt % 8 ? " " : "\n" );

cout "\n\n\n";

// напечатаем статистику

cout "И напоследок статистика:\n\n";

mapstring,int,lessstring,allocator::iterator siter;

for (siter=stats.begin(); siter!=stats.end(); ++siter)

cout (*siter).first " "

"было заменено "

(*siter).second

(" раз(а)\n" );

}

Вот результат работы программы:

Наш словарь подстановок:

key: 'em value: them

key: cuz value: because

key: gratz value: grateful

key: nah value: no

key: pos value: suppose

key: sez value: says

key: tanx value: thanks

key: wuz value: was

Исходный вектор строк:

nah I sez tanx cuz I wuz pos

to not cuz I wuz gratz

Преобразованный вектор строк:

no I says thanks because I was suppose

to not because I was grateful

И напоследок статистика:

cuz было заменено 2 раз(а)

gratz было заменено 1 раз(а)

nah было заменено 1 раз(а)

pos было заменено 1 раз(а)

sez было заменено 1 раз(а)

tanx было заменено 1 раз(а)

wuz было заменено 2 раз(а)

6.12.5. Удаление элементов map

Существуют три формы функции-члена erase() для удаления элементов отображения. Для единственного элемента используется erase() с ключом или итератором в качестве аргумента, а для последовательности эта функция вызывается с двумя итераторами. Например, мы могли бы позволить удалять элементы из text_map таким образом:

string removal_word;

cout "введите удаляемое слово: ";

cin removal_word;