Главная » C++, C++ Builder » Работа с таблицами STL

0

Следующая вещь, с которой мы познакомимся в процессе разговора о STL — таблицы (или карты, maps). <Следующее высказывание построено на том, что по-английски этот класс STL называется map, то есть карта. В переводе же этот термин переводчик счел нужным заменить на таблицу. — Прим. пер.> Карты — это классно. Они говорят вам, как добраться из  Нью-Йорка  в  Колорадо самым коротким путем, а также где эта замечательная дорога уходит с хайвея. Они не дадут вам потеряться и помогут попасть туда, куда вы едете.

Ну хорошо, я не имел ввиду карты этого типа. Карта, map (или таблица) является также и структурой данных в STL, которая предоставляет удобный и мощный способ отобразить один вид данных в другой. Вместо того, чтобы пытаться объяснить концепцию таблицы, проще использовать пример, чтобы показать, что могут для вас делать карты (я имею ввиду, кроме того как перевести вас через хайвей Interstate 80).

В табл. 5.4 приведены важные методы класса map (таблица) в STL.

Таблица 5.4 Важные методы класса map

empty

Указывает, есть ли (FALSE) или нет (TRUE) элементы в таблице

count

Возвращает количество элементов, находящихся в данный момент в таблице

insert

Добавляет новый элемент в таблицу

erase

Удаляет существующий элемент из таблицы

find

Выполняет поиск по данному ключу в таблице

operator[]

Находит элемент в таблице, соответствующий ключевому значению

lower_bound

Возвращает нижнюю границу таблицы, т.е. первый элемент, удовлетворяющий данному ключевому значению

max_size

Возвращает максимальный возможный размер таблицы (обычно это максимальный объем памяти, свободной для выделения)

rbegin

Возвращает последний элемент в таблице (начиная с конца)

rend

Возвращает первый элемент в таблице (начиная с конца)

size

Возвращает выделенный размер таблицы, обычно это количество элементов в таблице

swap

Меняет данные между двумя таблицами

upper_bound

Возвращает последний элемент, подходящий под данное ключевое значение

operator=

Присваивает одной таблице другую, копируя все данные из первой таблицы во вторую

operator<<

Потоковый оператор, который позволяет выводить элемент таблицы в выходной поток

begin

Возвращает первый элемент в таблице

end

Возвращает последний элемент в таблице

key_comp

Сравнивает два элемента, используя функцию сравнения таблицы

for_each

Производит заданное действие над всеми элементами в таблице Вот пример применения этого класса:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <string>

#include <map>

int main(void)

{

map<string, string, less<string>,

allocator<string> > stringMap; stringMap["Kirk"] = "William Shatner"; stringMap["McCoy"] = "DeForest Kelley"; stringMap["Spock"] = "Leonard Nimoy"; stringMap["Scotty"] = "James Doohan"; stringMap["Sulu"] = "George Takei"; stringMap["Uhura"] = "Nichelle Nichols";

printf("Введите персонажа: "); char szBuffer[20]; gets(szBuffer);

if  (stringMap[szBuffer].length() )

printf("На самом деле это: %s\n", stringMap[szBuffer].c_str()); else

printf("Я не знаю такого персонажа!\n"); return 0;

}

В этом примере мы инициализируем объект map, используя строку как ключевое значение. Ключевое значение в этом примере — фамилия (а в случае персонажа Spock, еще и имя) персонажа в оригинальных сериях Star Trek (а вдруг вы их не узнали?), а значение, присваиваемое каждому ключу — имя актера, который играл этого персонажа в фильме. Потом мы запрашиваем у пользователя имя персонажа и печатаем имя актера. Если имя персонажа не найдено, то возращенная строка будет пустой. Мы рассматриваем это как условие ошибки и говорим пользователю, что такого персонажа не найдено.

Этот пример показывает несколько интересных аспектов объекта map. Во-первых, вы действительно относитесь к map как к массиву, с потенциально  нецелыми  индексами.  В  этом случае мы используем строку как индекс. Вторая вещь, которая быстро становится ясной, состоит в том, что вы можете иметь только один элемент на каждое ключевое значение в таблице, иначе вы не смогли бы определить, какой из элементов относится к данному индексу массива. Представьте себе использование массива целых и получение двух ответов на выражение array[0].

Таблицы содержат упорядоченные пары данных. Упорядочивая их, мы можем выстроить их по алфавиту, например для печати. Кроме того, мы можем относиться к таблице как к  словарю, получая определения «слов».

Зачем нужны таблицы?

Есть много очень хороших примеров использования таблиц. В нашем примере с классом vector, в частности, мы обращались к поисковым и заменяющим строкам как к массиву  в  программе замены  строк.  Мы  могли  бы  также  легко  создать  таблицу  ключей —  поисковых  строк  со

значениями — заменяющими строками. Так как таблицы упорядочены, то поиск в таблице заданного ключа работает очень быстро. Это делает таблицы замечательным выбором для простых структур, в которых требуется быстрый поиск данных. Макропроцессоры, словари, календари (расписания) событий могут выиграть от структуры и скорости таблиц.

Еще один класс в STL, multimap, позволяет иметь много элементов, соответствующих данному ключу. Если у вас ситуация, которая кажется идеальной для таблицы, но вы не можете гарантировать единственность элемента для каждого ключа в системе (скажем поиск телефонного номера, в котором не обязательно хранится код города, к примеру), то вам стоит обратить внимание вместо map на класс multimap. В основном методы и операторы для класса multimap (мультитаблица) в точности совпадают с методами и операторами класса map.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии