2009-03-30 12 views
0
типа

Map из STL имеет следующий вид:станда :: карты: почему карта принимает компаратор в качестве параметра шаблона

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

В качестве одного из параметров шаблона мы могли бы пройти Compare предикат, почему карта принимает этот предикат в качестве параметра шаблона а не как объект в конструкторе?

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

Я верю, что у него есть некоторые глубокие причины.

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

ответ

5

У карты такой конструктор. Из раздела 23.3.1 стандарта C++:

explicit map(const Compare& comp = Compare(), 
const Allocator& = Allocator()); 
+0

+1 - Спасибо. Но, извините, я принял ответ Роба, потому что он был раньше вас. – bayda

+1

На самом деле, ответ Нила был раньше примерно на 3 минуты, поэтому, если вы используете время отправки в качестве тай-брейкера для других одинаково полезных ответов, пожалуйста, примите решение принять этот ответ. –

+0

Это действительно не имеет значения! – 2009-03-30 22:40:47

3

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

+0

хорошая точка, но решение std более приятное)) Благодарим вас за помощь. – bayda

+0

Я думаю, что вторая часть вашего вопроса о «глубоких причинах» совершенно верна, а не тупой! :) Кстати, std :: tr1 :: функция уже полустандартна, см. Http://en.wikipedia.org/wiki/Technical_Report_1 –

7

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

+0

Хорошо. Я новичок на этом сайте и не знаю правил о награждении. Но я подозреваю, что это зависело от скорости. В любом случае, спасибо за ваш ответ. – bayda

2

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

+0

«Цель стандартной библиотеки должна быть не менее эффективной, чем то, что хороший программист на C++ генерирует самостоятельно». Хорошая точка тоже. +1 за то, что помни меня. – bayda

Смежные вопросы