Чтение онлайн

на главную - закладки

Жанры

C++. Сборник рецептов

Когсуэлл Джефф

Шрифт:

Пример 6.7. Использование собственного функтора сортировки

#include <iostream>

#include <map>

#include <string>

using namespace std;

class Person {

 friend class PersonLessThan;

public:

 Person(const string& first, const string& last) :

lastName_(last), firstName_(first) {}

 // ...

 string getFirstName const {return(firstName_);}

 string getLastName const {return(lastName_);}

private:

 string lastName_;

 string firstName_;

};

class PersonLessThan {

public:

 bool operator(const Person& per1,

const Person& per2) const {

if (per1.lastName_ < per2. lastName_) //
Сравнить фамилии,

return(true); // а затем

else if (per1.lastName_ == per2.lastName_) // имена

return(per1.firstName_ < per2.firstName_);

else

return(false);

 }

};

int main {

 map<Person, string, PersonLessThan> personMap;

 Person per1("Billy", "Silly"),

per2("Johnny", "Goofball"),

per3("Frank", "Stank"),

реr4("Albert", "Goofball");

 personMap[per1] = "cool";

 personMap[per2] = "not cool";

 personMap[per3] = "not cool";

 personMap[per4] = "cool";

 for (map<Person, string, PersonLessThan>::const_iterator p =

personMap.begin; p != personMap.end; ++p) {

cout << p->first.getFirstName << " " << p->first.getLastName

<< " is " << p->second << endl;

 }

}

map
это прекрасный способ хранить пары ключ/значение. После того как вы поймете поведение его частей, таких как
operator[]
и хранение данных (в виде объектов
pair<Key, Value>
),
map
предоставит простоту в использовании и высокую производительность.

Смотри также

Рецепт 6.7.

6.7. Использование хеш-контейнеров

Проблема

Требуется сохранить ключи и значения, обеспечив постоянное время доступа к элементам, и не требуется хранения элементов в упорядоченном виде.

Решение

Используйте один из связанных с хешами контейнеров —

hash_map
или
hash_set
.
Однако помните, что они не входят в число стандартных контейнеров, определяемых стандартом С++, а представляют собой расширения, включаемые большинством реализаций стандартной библиотеки. Пример 6.8 показывает, как использовать
hash_set
.

Пример 6.8. Хранение строк в hash_set

#include <iostream>

#include <string>

#include <hash_set>

int main {

 hash_set<std::string> hsString;

 string s = "bravo";

 hsString.insert(s);

 s = "alpha";

 hsString.insert(s);

 s = "charlie";

 hsString.insert(s);

 for (hash set<string>::const_iterator p = hsString.begin;

p != hsString.end; ++p)

cout << *p << endl; // заметьте, что здесь не гарантируется хранение

// в упорядоченном виде

}

Обсуждение

Контейнеры, основанные на хешах, — это популярные во всех языках структуры данных, и прискорбно, что стандарт C++ не требует их реализации. Однако если требуется использовать хеш-контейнер, то не все потеряно: высока вероятность, что используемая вами реализация стандартной библиотеки содержит

hash_map
и
hash_set
, но тот факт, что они не стандартизованы, означает, что их интерфейсы могут отличаться от одной реализации стандартной библиотеки к другой. Я опишу хеш-контейнеры, которые поставляются в составе реализации стандартной библиотеки STLPort.

STLPort — это свободно распространяемая переносимая реализация стандартной библиотеки, существующая уже довольно длительное время и предоставляющая хеш-контейнеры. При использовании другой библиотеки интерфейс может быть другим, но общая идея будет той же самой.

Главной особенностью хеш-контейнеров (называемых во многих книгах по ассоциативными хеш-контейнерами) является то, что они в общем случае предоставляют постоянное время поиска, вставки и удаления элементов, а в худшем случае эти операции имеют линейное время. Ценой постоянного времени выполнения этих операций является то, что в хеш-контейнере они хранятся в неупорядоченном виде, как в

map
.

Посмотрите на пример 6.8. Использование хеш-контейнера (в данном случае

hash_set
) довольно просто — объявите его как большинство других контейнеров и начните вставлять в него элементы.

hash_set<string> hsString; // hash_set строк

string s = "bravo";

hsString.insert(s); // Вставка копии s

Использование

hash_map
аналогично, за исключением того, что требуется, как минимум, указать типы данных используемых ключей и значений. Это аналогично
map
.

Поделиться:
Популярные книги

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь

Маверик

Астахов Евгений Евгеньевич
4. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Маверик

Мужчина моей судьбы

Ардова Алиса
2. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.03
рейтинг книги
Мужчина моей судьбы

Развод, который ты запомнишь

Рид Тала
1. Развод
Любовные романы:
остросюжетные любовные романы
короткие любовные романы
5.00
рейтинг книги
Развод, который ты запомнишь

Кодекс Охотника. Книга XIV

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Столкновение

Хабра Бал
1. Вне льда
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Столкновение

Черный маг императора

Герда Александр
1. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Любимая учительница

Зайцева Мария
1. совершенная любовь
Любовные романы:
современные любовные романы
эро литература
8.73
рейтинг книги
Любимая учительница

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Боярышня Дуняша 2

Меллер Юлия Викторовна
2. Боярышня
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Боярышня Дуняша 2

Убивать чтобы жить 9

Бор Жорж
9. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 9

Новый Рал 7

Северный Лис
7. Рал!
Фантастика:
попаданцы
5.00
рейтинг книги
Новый Рал 7

Боги, пиво и дурак. Том 3

Горина Юлия Николаевна
3. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 3