hash_set was not declared even I #include<hash_set>

E

eric

Dear advanced c/g++ programers:
I tried the following code
-----------------------------------------------------------------------------------------
// Example 6-8 Storing strings in a hast_set
#include <iostream>
#include <string>
#include <hash_set>
using namespace std;

int main() {

hash_set<std::string> hsString;
string s = "bravo";

hsString.insert(s);
s = "alpha";
hsString.insert(s);
s = "charlie";
hsString.insert(s);

for (hash_set<string>::const_iterator p = hsString.begin();
p != hsString.end(); ++p)
cout << *p << endl; // Note that these aren't guaranteed
// to be in sorted order
}
---------------------------------------------------------------------------------------------------
but I got the following compile error(g++ 4.5.2)
----------------------------------------------------------------
eric@eric-laptop:~/cppcookbook/ch6$ g++ -Wno-deprecated Example6-8.cpp
Example6-8.cpp: In function ‘int main()’:
Example6-8.cpp:9:3: error: ‘hash_set’ was not declared in this scope
Example6-8.cpp:9:23: error: expected primary-expression before ‘>’
token
Example6-8.cpp:9:25: error: ‘hsString’ was not declared in this scope
Example6-8.cpp:18:23: error: expected primary-expression before ‘>’
token
Example6-8.cpp:18:24: error: ‘::const_iterator’ has not been declared
Example6-8.cpp:18:41: error: expected ‘;’ before ‘p’
Example6-8.cpp:19:8: error: ‘p’ was not declared in this scope
eric@eric-laptop:~/cppcookbook/ch6$
---------------------------------------------------------------------
your can get the code to test by yourself
source code
http://examples.oreilly.com/9780596007614/

Thanks your help a lot in advance, Eric
 
M

Michael DOUBEZ

  I tried the following code [snip]
#include <string>
#include <hash_set>
using namespace std; [snip]
  hash_set<std::string> hsString; [snip]
Thanks your help a lot in advance, Eric

hash_set is not part of c++. It was specified in STL SGI but was not
included in the standard. g++ provides it as a backward compatibility
in the namespace __gnu_cxx.

Add:
using __gnu_cxx::hash_set;

Note that no default hash function is provided for string, you have to
define it:
namespace __gnu_cxx {
template<> struct hash< std::string > {
size_t operator()( const std::string& x ) const {
return hash< const char* >()( x.c_str() );
}
};
}
 
M

Miles Bader

Michael DOUBEZ said:
hash_set is not part of c++. It was specified in STL SGI but was not
included in the standard. g++ provides it as a backward compatibility
in the namespace __gnu_cxx.

For a non-ancient version of g++ (or any other compiler with
sufficient c++0x support), wouldn't it be better to just use
"unordered_set" instead? I thought that was basically just hash_set
with a different name (but an actual part of the standard)...

-Miles
 
M

Michael DOUBEZ

For a non-ancient version of g++ (or any other compiler with
sufficient c++0x support), wouldn't it be better to just use
"unordered_set" instead?

Yes. Even TR1 support is enough.
 I thought that was basically just hash_set
with a different name (but an actual part of the standard)...

But the OP is trying to compile examples from C++CookBook.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,902
Latest member
Elena68X5

Latest Threads

Top