CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 1 of 1
  1. #1
    Join Date
    May 2004

    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.

    #include <string>
    #include <hash_map>
    #include <iostream>
    // The following class defines a hash function for strings 
    class stringhasher : public stdext::hash_compare <std::string>
       * 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;
        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;
        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

On-Demand Webinars (sponsored)

We have made updates to our Privacy Policy to reflect the implementation of the General Data Protection Regulation.