Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать объект сравнения для stl map 
:(
    Опции темы
EnergoHokum
Дата 25.3.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: нет
Всего: 6



Счас попытаюсь сформулировать, что-же я хочу понять, итак:

Карта std::map. У карты есть ключ, есть значение, и ей можно передать некую структуру (аллокатор я не трогаю сейчас) с перегруженным оператором (). По умолчанию передаётся некто less. Что делает этот less применительно к карте? Имеет-ли это какое-нить отношение к упорядочиванию данных внутри карты? Имеет ли это какое-нить отношение к поиску как по ключу, так и по значению?

А я пока исходники STL посмотрю, может, что понятно станет...
PM MAIL ICQ   Вверх
korian
Дата 25.3.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(EnergoHokum @  25.3.2008,  14:35 Найти цитируемый пост)
Что делает этот less применительно к карте? Имеет-ли это какое-нить отношение к упорядочиванию данных внутри карты? Имеет ли это какое-нить отношение к поиску как по ключу, так и по значению?

less, в данном случае, используется для сравнения двух ключей, и return true, если первый ключ меньше второго.
при добавлении нового елемента, используется для поиска места, куда новый элемент вставить, чтобы сохранить очередность.
используется при поиске по ключу (std::map::find).
по значению, искать в map нельзя.
разве что только внешними средствами.


Это сообщение отредактировал(а) korian - 25.3.2008, 16:08
PM   Вверх
Любитель
Дата 25.3.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(EnergoHokum @  25.3.2008,  15:35 Найти цитируемый пост)
Что делает этот less применительно к карте?

std::less вызывает оператор < для аргументов и возвращает bool само собой smile

Цитата(EnergoHokum @  25.3.2008,  15:35 Найти цитируемый пост)
 Имеет-ли это какое-нить отношение к упорядочиванию данных внутри карты?

Само собой. Данные хранятся в виде сбалансированного бинарного дерева. В качестве критерия сравнения (построения дерева) используется заданный функтор.

Цитата(EnergoHokum @  25.3.2008,  15:35 Найти цитируемый пост)
Имеет ли это какое-нить отношение к поиску как по ключу, так и по значению?

К поиску по ключу с помощью find почти нет. Если соблюдены предикаты для компаратора (типа, если a < b, то не может быть b < a). При поиске с помощью lower_bound и пр. - конечно имеет smile

Что касается поиска по значения - или вручную, или скажем find_if. Конечно поиск по значению будет иметь линейную сложность вместо логарифмической. Если тебя реально нужен двусторонний map - посмотри в сторону boost:multi_index


--------------------
PM MAIL ICQ Skype   Вверх
Earnest
Дата 28.3.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Любитель @  25.3.2008,  17:58 Найти цитируемый пост)
К поиску по ключу с помощью find почти нет.

Да ты что, Любитель, конечно имеет - к map::find. Предикат сравнения определяет дорожку, по которой ищется ключ - не все же элементы просматривать - нафиг тогда map; собственно говоря, lower_bound работает практически так же, только возвращают они разное. 


--------------------
...
PM   Вверх
Любитель
Дата 28.3.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Я имел ввиду не внутреннюю реализацию, а внешнее поведение - результат будет один smile При естественной реализации компаратора (см. выше).


--------------------
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.