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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::multimap: не учитывать регистр ключа? 
V
    Опции темы
Alca
Дата 6.7.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 50



std::multimap: не учитывать регистр ключа?

Код

#include <map>

typedef std::multimap<std::string, std::string> TStringMultiMap;

std::string CXMimeHeader::sGetField(const std::string &csName) {
    std::string sRes = "";

    std::pair<TStringMultiMap::iterator, TStringMultiMap::iterator> prEqualRange = _m_mmsHeader.equal_range(csName);
    
    TStringMultiMap::iterator it;
    for (it = prEqualRange.first; it != prEqualRange.second; ++ it) {
        sRes = (*it).second;
    }

    return sRes;
}


Код

CXMimeHeader mhHeader;
std::string    sMessageId;
//...
sMessageId = mhHeader.sGetField("Message-ID"); 
assert(false == sMessageId.empty());    

sMessageId = mhHeader.sGetField("Message-Id"); 
assert(false == sMessageId.empty());

Т.е. поле "Message-ID" может быть как "Message-ID", так и "Message-Id", так и "Message-id".
Надо получить доступ к ключу без учета регистра. Как  это сделать?

Это сообщение отредактировал(а) Alca - 6.7.2009, 10:32


--------------------
PM WWW ICQ Skype Jabber   Вверх
Любитель
Дата 6.7.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Использовать третий параметр шаблона multimap (предикат сравнения).


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


Эксперт
****


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

Репутация: 7
Всего: 50



Можно примерчик?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Lazin
Дата 6.7.2009, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Код

struct Cmp
{
  bool operator (std::string const& lhs, std::string const& rhs) const
  {
     return <результат сравнения без учета регистра>;
  }
};

std::map<std::string, int, Cmp> map;

PM MAIL Skype GTalk   Вверх
Alca
Дата 6.7.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 50



Код

struct Cmp 
{
    BOOL operator () (std::string const &s1, std::string const &s2) const 
    {
        INT iRes = - 1;

        iRes = ::lstrcmpi(s1.c_str(), s2.c_str());
        if (0 != iRes) {
            FALSE;
        }

        return TRUE;
    }
};
typedef std::multimap<std::string, std::string, Cmp> TStringMultiMap;

Типа так?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 6.7.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 50



Код

struct CompareNoCase
{
    bool operator () (std::string const &s1, std::string const &s2) const 
    {
        INT iRes = - 1;

        iRes = ::lstrcmpi(s1.c_str(), s2.c_str());
        if (0 != iRes) {
            false;
        }

        return true;
    }
};

typedef std::multimap < std::string, std::string, CompareNoCase > TStringMultiMap;

Получилась маленькая запинка...
Когда вставляю в контейнер ключ и значение
Код

    for (size_t i = 0; i < vecsHeader.size(); i ++) { //vecsHeader - содержит пары ключ, значение с разделителем ":"
        std::vector<std::string> vecsLines;        
        vecsLines = vecsSplitKeyValue(vecsHeader.at(i), _ms_csAttrDelimiter/*:*/);    

        //вставляем в список "ключ" и "значение"
        std::string sKey   = sTrimSpace(vecsLines.at(0));
        std::string sValue = sTrimSpace(vecsLines.at(1));

        _m_mmsHeader.insert(std::pair<std::string, std::string>(sKey, sValue));
    }

валиться эссерт. 
Причем при 1-ой вставке такого нет, сразу на второй ошибка.
Цитата

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: ...\Test\Project\Debug\Test.exe
File: d:\_tmp_progfiles\microsoft visual studio 9.0\vc\include\xtree
Line: 638

Expression: invalid operator<

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Прервать   Повтор   Пропустить   
---------------------------




Это сообщение отредактировал(а) Alca - 6.7.2009, 12:26


--------------------
PM WWW ICQ Skype Jabber   Вверх
Любитель
Дата 6.7.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Конечно, ты должен предоставить свою реализацию для "меньше". А не равно.

[off]Нафига нужны эти BOOL?![/off]


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


Эксперт
****


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

Репутация: 7
Всего: 50



Тупанул...
Код

struct CompareNoCase
{
    bool operator () (std::string const &s1, std::string const &s2) const 
    {
        bool bRes = ::lstrcmpi(s1.c_str(), s2.c_str()) < 0;

        return bRes;
    }
};

так?

Добавлено через 1 минуту и 17 секунд
Цитата

Нафига нужны эти BOOL?!

убрал


--------------------
PM WWW ICQ Skype Jabber   Вверх
Acer
Дата 6.7.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

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



Код

struct CompareNoCase
{
    bool operator () (std::string const &s1, std::string const &s2) const 
    {
        return ::lstrcmpi(s1.c_str(), s2.c_str()) < 0;
    }
};

PM MAIL   Вверх
Vaulter
Дата 6.7.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 2
Всего: 22



а при вставке нельзя все приводить в нижний регистр?
соотв-но и при поиске?


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


Эксперт
****


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

Репутация: 7
Всего: 50



Цитата

а при вставке нельзя все приводить в нижний регистр?

 smile 
Спасибо, разобрался.
Код

struct CompareNoCase
{
    bool operator () (std::string const &s1, std::string const &s2) const 
    {
        return ::lstrcmpi(s1.c_str(), s2.c_str()) < 0;
    }
};



--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0525 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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