Solved

change compare criterion for map

Posted on 2002-04-14
3
273 Views
Last Modified: 2012-06-21
I have
map<string,STRUCT> mymap;

When I do a find on the key, I get case sensitive comparison. How do I get a case-insensitive comparison? I think I should change the default 'comp' function.
0
Comment
Question by:mfc_speak
3 Comments
 
LVL 6

Accepted Solution

by:
thienpnguyen earned 50 total points
ID: 6941334
struct costGreater
{
    bool operator()(const string str1, const string str2) const
    {
        return  stricmp(str1.c_str(), str2.c_str()) > 0 ?  true : false;
    }
};


map<string,STRUCT, costGreater> mymap;

=========================

Demo program

#if (_MSC_VER >= 1200)
#pragma warning(disable: 4786)
#endif

#include <string.h>
#include <string>
#include <map>
#include <iostream>
using namespace std;

struct costGreater
{
    bool operator()(const string str1, const string str2) const
    {
        return  stricmp(str1.c_str(), str2.c_str()) > 0 ?  true : false;
    }
};

int main()
{
    map<string,int, costGreater>  mymap;

    mymap["hello"] = 1;
    mymap["HELLO"] = 20;

    cout << mymap["hello"] << endl << mymap["HELLO"];

    return 0;
}


0
 
LVL 30

Expert Comment

by:Axter
ID: 6941880
stricmp is not part of the C++ standard, although most compilers do support it.

Here's the code for a case insensitive string. (ci_string)

#ifndef CI_STRING_HEADER_GAURD_
#define CI_STRING_HEADER_GAURD_

#include <string>
#include <iostream>
#include <cctype>
#include <algorithm>
#include <functional>

/* replace functions of the standard char_traits<T_chr>
* so that strings behave in a case-insensitive way
*/
template <typename T_chr>
struct ci_char_traits : public std::char_traits<T_chr> {
    // return whether c1 and c2 are equal
    static bool eq(T_chr c1, T_chr c2)
     {
        return toupper(c1)==toupper(c2);
    }
     static bool ne( T_chr c1, T_chr c2 )
     {
          return toupper(c1) != toupper(c2);
     }
     
    // return whether c1 is less than c2
    static bool lt(T_chr c1, T_chr c2)
     {
        return toupper(c1)<toupper(c2);
    }
    // compare up to n characters of s1 and s2
    static int compare(const T_chr* s1, const T_chr* s2, size_t n)
     {
        for (size_t i=0; i<n; ++i)
          {
            if (!eq(s1[i],s2[i]))
               {
                return lt(s1[i],s2[i])?-1:1;
            }
        }
        return 0;
    }
    // search c in s
    static const T_chr* find(const T_chr* s, size_t n, T_chr c)
     {
        while( n-- > 0 && toupper(*s) != toupper(c) )
          {
               ++s;
          }
          return s;
         
    }
};

// define a special type for such strings
typedef std::basic_string<char,ci_char_traits<char> > ci_string;
typedef std::basic_string<wchar_t,ci_char_traits<wchar_t> > wci_string;

/* define an output operator
* because the traits type is different than that for std::ostream
*/
inline std::ostream& operator << (std::ostream& strm, const ci_string& s)
{
    // simply convert the ci_string into a normal string
    return strm << std::string(s.data(),s.length());
}

inline std::ostream& operator << (std::ostream& strm, const wci_string& s)
{
    // simply convert the ci_string into a normal string
    return strm << std::wstring(s.data(),s.length()).c_str();
}
#endif //!CI_STRING_HEADER_GAURD_
0
 

Author Comment

by:mfc_speak
ID: 6942810
Simple and works
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question