![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Есть карта, такого вида:
Подскажите, как правильно создать свой объект сравнения, чтобы key_compare нормально выполнялся? Если ключ будет не std::string, а, например, char -- сравнение идёт нормально. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
EnergoHokum, а в чем собственно проблема? Данный объект можно использовать и порядок будет по возрастанию значения ключа. Никакого key_compare не нужно.
|
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Ну, например, я пишу вот так:
и у меня находится ключ "one". Не пойму, или нужно переопределить сравнение, или я откровенно туплю. |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
[censored 6], нафига так писать, пока понял что в цикле делается....
key_comp() - это функция не сравнения, это функция "меньше", поэтому так и работает. т.к. у вас "one" больше "o", функция сразу возвращает false и выход из цикла. причем даже если б было сравнение, то они не равны и сразу выход из цикла. Это сообщение отредактировал(а) korian - 25.3.2008, 12:11 |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Этот пример я с cplusplus.com брал (немного доработав напильником). С ангельским языком у меня не очень, поэтому толком и не разобрался. И всё-таки вопрос: как переопределить функцию сравнения ключей? Я пока не нашёл в инете (хотя когда-то видел).
|
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
|
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Прошу прощения, но никак не могу понять методику применения этой struct MyLess. :-/ Можно пример?
|
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
что конкретно не понятно? имеем клас с перегруженным оператором ()
пусть есть std::string a, b; MyLess ls; тогда в данной реализации MyLess()(a, b) (a < b) и ls(a, b) едентичные записи. Это сообщение отредактировал(а) korian - 25.3.2008, 13:36 |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Ну, само по себе использование этой структуры понятно, неясен принцип использования её в сборе с картой.
|
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
карта должна быть всегда отсортированной а "отсортированный" означает, что каждый элемент карты не больше следующего (вроде так) потому для сортировки требуется функция (или функтор), которая для 2х элементов скажет, какой из них меньше в примере korian, этот функтор - MyLess |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Да это понятно, в любой статье про STL написано.
|
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
map принимает оператор "меньше" для сравнения элементов и сортировки по ключу (с помощью оператора "меньше" можно вывести любой другой оператор сравнения)
std::map<std::string,int> imap; = std::map<std::string,int,std::less<std::string> > imap; где less это, что-то типа такого:
сортировка в map'е используется для того, чтобы быстро находить элемент по ключу бинарным поиском. короче, я все равно не понимаю, что конкретно не понятно что такое map или что такое less или что-то еще. Добавлено через 2 минуты и 21 секунду std::map<std::string,int>::iterator iter = imap.find("one"); if (iter != imap.end()) тогда *iter == "one" |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Ну туплю я, туплю! Это сообщение отредактировал(а) EnergoHokum - 25.3.2008, 14:19 |
|||
|
||||
| phprus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: 1 Всего: 3 |
В map'е же есть метод find, который ищет запись по ключу и если такая запись есть, то он возвращает итератор указывающий на нее, а если такой записи нету то возвращает mapobj.end(); Почему ты его не используешь? |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Для этого есть готовые методы (поиск по точному ключу или по границе). Зачем что-то городить? =-o |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |