Visual C++ STL: How do I use hash maps with Visual C++?
CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 1 of 1

Thread: Visual C++ STL: How do I use hash maps with Visual C++?

Threaded View

  1. #1
    Join Date
    May 2004
    Posts
    45

    Visual C++ STL: How do I use hash maps with Visual C++?

    Q: How to use the hash_map class in C++

    A: If you have Visual Studio .NET 2003 you can try the 'hash_map' class instead of the map if you want to use hash tables instead of binary trees to store your pairs 'key -> value'. There follows a example of a hash_map.

    I know that it's a lot easier to use the hash_map from the SGI's STL implementation, but if you must use Visual Studio .NET 2003 you'll need to know this.

    Code:
    #include <string>
    #include <hash_map>
    #include <iostream>
    
    // The following class defines a hash function for strings 
    class stringhasher : public stdext::hash_compare <std::string>
    {
    public:
      /**
       * Required by 
       * Inspired by the java.lang.String.hashCode() algorithm 
       * (it's easy to understand, and somewhat processor cache-friendly)
       * @param The string to be hashed
       * @return The hash value of s
       */
      size_t operator() (const std::string& s) const
      {
        size_t h = 0;
        std::string::const_iterator p, p_end;
        for(p = s.begin(), p_end = s.end(); p != p_end; ++p)
        {
          h = 31 * h + (*p);
        }
        return h;
      }
    
      /**
       * 
       * @param s1 The first string
       * @param s2 The second string
       * @return true if the first string comes before the second in lexicographical order
       */
      bool operator() (const std::string& s1, const std::string& s2) const
      {
        return s1 < s2;
      }
    };
    
    typedef stdext::hash_map<std::string, std::string, stringhasher> HASH_S_S;
    
    /**
     * Compile this program with "cl -GX hash_sample.cpp" 
     * if using MSVC++ 7.1 (Visual Studio .NET 2003)
     */
    int main (int argc, char *argv[])
    {
      HASH_S_S hm;
      HASH_S_S::iterator it;
        
      //-- Inserting the names of months in a hash map
      //-- key = names of the months in Portuguese
      //-- value = names of the months in English
      hm[std::string("janeiro")] = std::string("January");
      hm[std::string("fevereiro")] = std::string("February");
      hm[std::string("março")] = std::string("March");
      hm[std::string("abril")] = std::string("April");
      hm[std::string("maio")] = std::string("May");
      hm[std::string("junho")] = std::string("June");
      hm[std::string("julho")] = std::string("July");
      hm[std::string("agosto")] = std::string("August");
      hm[std::string("setembro")] = std::string("September");
      hm[std::string("outubro")] = std::string("October");
      hm[std::string("novembro")] = std::string("November");
        
      //-- Searching for the translation of the months "março" and "dezembro" in the map
      //-- (dezembro was not put into the map, so you can not find the corresponding element "December")
      it = hm.find(std::string("março"));
      if(it != hm.end())
        std::cout << "The value corresponding to the key 'março' is " << it->second << std::endl;
      else
        std::cout << "The value corresponding to the key 'março' was not found" << std::endl;
    
      it = hm.find(std::string("dezembro"));
      if(it != hm.end())
        std::cout << "The value corresponding to the key 'dezembro' is " << it->second << std::endl;
      else
        std::cout << "The value corresponding to the key 'dezembro' was not found" << std::endl;
            
      //-- Listing the pairs key, value (they're not ordered.)
      for(it = hm.begin(); it != hm.end(); ++it) 
      {
        std::cout << "Key = \'" << it->first << "\' -> value = \'" << it->second << "\'" << std::endl;
      }
    }

    Last edited by Andreas Masur; July 24th, 2005 at 01:14 PM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  


Windows Mobile Development Center


Click Here to Expand Forum to Full Width

This is a CodeGuru survey question.


Featured


HTML5 Development Center