Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

std::map три аргумента, в каких случаях такое может быть?

#cpp #map


Здравствуйте!
Подскажите, пожалуйста, что могут означать три аргумента в ассоциативном контейнере
и в каких случаях такое возможно?. Обычно их два - ключ и значение, но я нашел в рабочем
коде три:

typedef std::map dest_map;

    


Ответы

Ответ 1



Третий аргумент — это компаратор, функциональный объект (или функция, как частный случай), позволяющий узнавать порядок любых двух ключей относительно друг друга. Это нужно потому, что std::map — это упорядоченный список пар «ключ — значение». Вот компаратор и позволяет определить правила этого упорядочивания. При этом упорядочивание не только используется для ускорения поиска записей, но и определяет, в каком порядке эти записи будут выдаваться при переборе элементов списка.

Ответ 2



Вообще-то у стандартного шаблона-контейнера std::map даже не три, а четыре шаблонных параметра: ключ, данные, компаратор и аллокатор. template< class Key, class T, class Compare = std::less, class Allocator = std::allocator > > class map; Все четыре параметра - типы. Фактические же объекты этих типов создаются во время выполнения. Объекты типа "ключ" и "данные" вы передаете сами при создании элементов, а фактические объекты компаратора и аллокатора создаются при конструировании контейнера. Вы ранее могли пользоваться данным контейнером указывая два шаблонных аргумента только потому, что у третьего и четвертого аргумента, как вы видите выше, есть аргументы по умолчанию - std::less и std::allocator соответственно. В данном случае вы смотрите на пример, в котором указан другой тип компаратора.

Комментариев нет:

Отправить комментарий