typename LessThanFun = std::less
// используемые для сортировки
typename Alloc = std::allocator
Key
Value
— это типы ключа и связанного значения, которые хранятся в отображении. LessThanFun
— это функция или функтор, который принимает два аргумента и возвращает истину, если первый меньше, чем второй. По умолчанию используется стандартный функтор less
. Alloc
— это распределитель памяти, и по умолчанию используется стандартный.Использование map
map
В результате будет создан map
string
. С помощью operator[]
поместите в отображение объекты, что интуитивно и легко читаемо.strMap["Monday"] = Montag";
strMap["Tuesday"] = "Dienstag";
strMap["Wednesday"] = "Mittwoch"; // ...
В результате в map
"Monday"
) в качестве ключа и правым операндом в качестве значения. Они хранятся в порядке, определяемом параметром шаблона LessThanFun
, и если он не указан, то map
использует std::less
.Чтобы получить значения из map
operator[]
в правой части присвоения, как здесь.wedInGerman = strMap["Wednesday"];
В манере всех стандартных контейнеров значение, связанное с ключом "Wednesday"
operator=
копируется в объект wedInGerman
.operator[]
operator[k]
возвращает ссылку на значение, ассоциированное с k
— независимо от того, существует ли k
в map
или нет. Если k
уже находится в map
, то возвращается ассоциированное с ним значение. Если нет, то k
вставляется, а затем используется конструктор по умолчанию, который создает объект значения для этого ключа. Чтобы сделать это более понятным, рассмотрим, что делает следующий код.map
string myZip = mapZipCodes["Tempe"]; // В map пока что нет элементов,
// но чему теперь равно count()?
Что находится в myZip
mapZipCodes
? Так как operator[]
вставляет указанный ключ, если он не существует, myZip
содержит пустую строку, а в mapZipCodes
содержится один элемент. Это может оказаться нежелательно, но независимо от вашего желания помните, что operator[]
не является const
-методом: всегда есть вероятность того, что он изменит состояние map
, добавив узел.Метод insert
insert
выполняет строгую вставку, а не вставку/обновление, как operator[]
. При использовании map (но не multimap
, который может содержать дублирующиеся ключи) insert
, если ключ уже существует, не делает ничего. По сравнению с ним operator[]
, если ключ уже существует, заменяет значение объекта для этого ключа на новое.Но синтаксис вставки требует несколько большей работы, чем operator[]
map
хранит данные. Рассмотрим строку из примера 6.6.strMap.insert(std::make_pair("Sunday", "Sonntag"));
map
pair
, pair
— это простой вспомогательный шаблон класса (объявленный в
и включенный в
), который хранит два значения двух типов. Чтобы объявить pair
из двух string
, сделайте так.pair
Первый и второй элементы в pair
first
и second
. При использовании для доступа к элементам map
оператора operator[]
обычно работать с pair
не приходится, но в случае со многими другими методами это придется делать, так что следует знать, как создавать и использовать объекты pair
. Например, итераторы разыменовываются в простые объекты pair
, так что при их использовании, как это делается в примере 6.6, следует знать, как получить ключ и его значение.for (map
p != strMap.end(); ++p)
cout << "English: " << p->first
<< ", German: " << p->second << endl;
Ключ хранится в first
second
.