for (SessionHashMap::iterator p = sessionMap_.begin;
p != sessionMap_.end; ++p)
delete (*p).second; // Удаление объекта Session
}
Session* addSession(const string& login) {
Session* p = NULL;
if (!(p = getSession(login))) {
p = new Session;
sessionMap_[login] = d; // Присвоение новой сессии с помощью
} // operator[]
return(p);
}
Session* getSession(const string& login) {
return(sessionMap_[login]);
}
// ...
private:
SessionHashMap sessionMap_;
};
Каждый ключ отображается на единственный участок, а в участке может храниться несколько ключей. Участок это обычно одно- или двухсвязный список.
По хеш-функциям и таблицам написано огромное количество книг. Если вы заинтересовались этим вопросом, поищите в Google «C++ hash function».
Смотри также
Рецепт 6.6.
6.8. Хранение объектов в упорядоченном виде
Проблема
Требуется сохранить набор объектов в заданном порядке, например с целью доступа к упорядоченным диапазонам этих объектов без их пересортировки при каждом таком обращении.
Решение
Используйте ассоциативный контейнер
set
, объявленный в
<set>
, который хранит элементы в упорядоченном виде. По умолчанию он использует стандартный шаблон класса
less
(который для своих аргументов вызывает
operator<
), а можно передать в него собственный предикат сортировки. Пример 6.10 показывает, как сохранить строки в
set
.
Пример 6.10. Хранение строк в set
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main {
set<string> setStr;
string s = "Bill";
setStr.insert(s);
s = "Steve";
setStr.insert(s);
s = "Randy";
setStr.insert(s);
s = "Howard";
setStr.insert(s);
for (set<string>::const_iterator p = setStr.begin;
p != setStr.end; ++p)
cout << *p << endl;
}
Так
как значения хранятся в упорядоченном виде, вывод будет выглядеть так.
Bill
Howard
Randy
Steve
Обсуждение
set
(набор) — это ассоциативный контейнер, который предоставляет логарифмическую сложность вставки и поиска и постоянную сложность удаления элементов (если требуется удалить найденный элемент),
set
— это уникальный ассоциативный контейнер, что означает, что никакие два элемента не могут быть равны, однако если требуется хранить несколько экземпляров одинаковых элементов, используйте
multiset
,
set
можно представить как набор в математическом смысле, т.е. коллекцию элементов, в дополнение обеспечивающую поддержание определенного порядка элементов.
Поддерживаются вставка и поиск элементов, но, как и список, набор не позволяет производить произвольный доступ к элементам. Если требуется получить что-то из набора, то можно найти элемент с помощью метода