std :: map design: почему map принимает компаратор в качестве параметра шаблона - PullRequest
0 голосов
/ 31 марта 2009

Тип карты из STL имеет следующий тип:

std::map< Key, Data, Compare, Alloc >

Как один из параметров шаблона мы можем передать предикат Compare, почему map принимает этот предикат как параметр шаблона, а не как объект в конструкторе?

Может иметь более гибкий интерфейс с чем-то вроде boost::function< bool, const T&, const T& > в конструкторе.
Конечно, я понимаю, что когда STL был спроектирован, boost не существует, но дизайнеры могли бы создать нечто похожее на boost :: function.

Я полагаю, у этого есть несколько глубоких причин.

EDITED
Извините за глупый вопрос, карта имеет такую ​​же возможность:)
Мой вопрос не имеет смысла после ваших ответов.

Ответы [ 4 ]

7 голосов
/ 31 марта 2009

Аргумент шаблона - это тип предиката, а не значение. Значение может быть предоставлено в качестве аргумента для конструктора. Вы можете указать любое значение, соответствующее типу. Как указано, тип по умолчанию - std::less<Key>, который в значительной степени имеет только одно значение, но вы должны иметь возможность указать свой собственный тип для аргумента Compare, включая boost::function, а затем использовать различные значения для управления поведением. объектов вашей карты.

5 голосов
/ 31 марта 2009

Карта Есть такой конструктор. Из раздела 23.3.1 стандарта C ++:

explicit map(const Compare& comp = Compare(),
const Allocator& = Allocator());
3 голосов
/ 31 марта 2009

Поскольку boost::function является полиморфным, он не может быть встроен. Дизайн STL нацелен на максимальный потенциал компиляции кода для компилятора, что легко для расширенных шаблонов; Также вы можете легко принять решение использовать boost::function для сравнения с std::map, если вам нужно, чтобы оно было полиморфным.

2 голосов
/ 31 марта 2009

Использование объекта сравнения создает затраты времени выполнения - объект должен быть сохранен, а сравнение должно выполняться через указатель. Используя класс, сравнение можно упростить до одного выражения, например, при использовании ключей int. Цель стандартной библиотеки состояла в том, чтобы быть не менее эффективным, чем то, что хороший программист на С ++ мог бы создать самостоятельно.

...