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

Поиск:

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


Опытный
**


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

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



Есть карта, такого вида:
Код

std::map<std::string,int> imap;//Именно такой порядок ключа и хранимого значения

Подскажите, как правильно создать свой объект сравнения, чтобы key_compare нормально выполнялся? Если ключ будет не std::string, а, например, char -- сравнение идёт нормально.
PM MAIL ICQ   Вверх
bsa
Дата 25.3.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 63
Всего: 196



EnergoHokum, а в чем собственно проблема? Данный объект можно использовать и порядок будет по возрастанию значения ключа. Никакого key_compare не нужно.
PM   Вверх
EnergoHokum
Дата 25.3.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




Ну, например, я пишу вот так:

Код

#include <stdio.h>
#include <string>
#include <map>
//-------------------------------------------------------------------------
int main(int argc,char** argv,char** envp)
{
    std::map<std::string,int> imap;
    std::map<std::string,int>::key_compare icomp;
    std::map<std::string,int>::iterator itimap;
    std::string refer="o";

    icomp=imap.key_comp();

    imap["one"]=100;
    imap["two"]=200;
    imap["three"]=300;
    imap["four"]=400;
    imap["five"]=500;
    imap["six"]=600;

    itimap=imap.begin();
    while((icomp((*itimap++).first,refer)))
    { if(itimap == imap.end()) { break; } }
    if(itimap != imap.end())
        printf("Compare: (*itimap).first=%s\n",(*(--itimap)).first.c_str());
    else
        printf("Compare: failed\n");

    return 0;


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


Опытный
**


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

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



[censored 6], нафига так писать, пока понял что в цикле делается....
key_comp() - это функция не сравнения, это функция "меньше", поэтому так и работает.
т.к. у вас "one" больше "o", функция сразу возвращает false и выход из цикла.
причем даже если б было сравнение, то они не равны и сразу выход из цикла.

Это сообщение отредактировал(а) korian - 25.3.2008, 12:11
PM   Вверх
EnergoHokum
Дата 25.3.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Этот пример я с cplusplus.com брал (немного доработав напильником). С ангельским языком у меня не очень, поэтому толком и не разобрался. И всё-таки вопрос: как переопределить функцию сравнения ключей? Я пока не нашёл в инете (хотя когда-то видел).
PM MAIL ICQ   Вверх
korian
Дата 25.3.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

struct MyLess : std::binary_function <const std::string&, const std::string&, bool>
{
    result_type operator() (first_argument_type arg1, second_argument_type arg2)
    {
         return arg1 < arg2; //сравниваем как хотим.
    }
};
std::map<std::string,int,MyLess> imap;

PM   Вверх
EnergoHokum
Дата 25.3.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Прошу прощения, но никак не могу понять методику применения этой struct MyLess. :-/ Можно пример?
PM MAIL ICQ   Вверх
korian
Дата 25.3.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM   Вверх
EnergoHokum
Дата 25.3.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну, само по себе использование этой структуры понятно, неясен принцип использования её в сборе с картой.
PM MAIL ICQ   Вверх
Alek86
Дата 25.3.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(EnergoHokum @  25.3.2008,  13:40 Найти цитируемый пост)
неясен принцип использования её в сборе с картой.

карта должна быть всегда отсортированной
а "отсортированный" означает, что каждый элемент карты не больше следующего (вроде так)
потому для сортировки требуется функция (или функтор), которая для 2х элементов скажет, какой из них меньше

в примере korian, этот функтор - MyLess


--------------------
user posted image    user posted image
PM MAIL   Вверх
EnergoHokum
Дата 25.3.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да это понятно, в любой статье про STL написано. smile Я туплю -- не могу поиск ключа в карте организовать! ВотЪ где проблема!
PM MAIL ICQ   Вверх
korian
Дата 25.3.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



map принимает оператор "меньше" для сравнения элементов и сортировки по ключу (с помощью оператора "меньше" можно вывести любой другой оператор сравнения)
std::map<std::string,int> imap; = std::map<std::string,int,std::less<std::string> > imap;
где less это, что-то типа такого:
Код

template<class T1, class T2>
struct less : std::binary_function <const T1&, const T2&, bool>
{
    result_type operator() (first_argument_type arg1, second_argument_type arg2)
    {
         return arg1 < arg2;
    }
};

сортировка в map'е используется для того, чтобы быстро находить элемент по ключу бинарным поиском.
короче, я все равно не понимаю, что конкретно не понятно  smile 
что такое map или что такое less или что-то еще.

Добавлено через 2 минуты и 21 секунду
std::map<std::string,int>::iterator iter = imap.find("one");
if (iter != imap.end())
    тогда *iter == "one"

PM   Вверх
EnergoHokum
Дата 25.3.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

я все равно не понимаю, что конкретно не понятно

Ну туплю я, туплю! smile Может благородный дон потупить немного?  smile Блин, всё-же плюсы -- пожалуй, самый монстроидальный язык нынче... Понаворотили Вавилонскую башню, а я мучаюсь тут!

Это сообщение отредактировал(а) EnergoHokum - 25.3.2008, 14:19
PM MAIL ICQ   Вверх
phprus
Дата 25.3.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

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



Цитата(EnergoHokum @  25.3.2008,  14:03 Найти цитируемый пост)
Я туплю -- не могу поиск ключа в карте организовать! ВотЪ где проблема! 

В map'е же есть метод find, который ищет запись по ключу и если такая запись есть, то он возвращает итератор указывающий на нее, а если такой записи нету то возвращает mapobj.end(); Почему ты его не используешь?
PM MAIL WWW ICQ   Вверх
Любитель
Дата 25.3.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(EnergoHokum @  25.3.2008,  14:03 Найти цитируемый пост)
Я туплю -- не могу поиск ключа в карте организовать

Для этого есть готовые методы (поиск по точному ключу или по границе). Зачем что-то городить? =-o


--------------------
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.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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