简单的 C++ hash_set 示例
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1374695/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
simple C++ hash_set example
提问by dzhelil
I am new to C++ and STL. I am stuck with the following simple example of a hash set storing custom data structures:
我是 C++ 和 STL 的新手。我坚持使用存储自定义数据结构的散列集的以下简单示例:
#include <iostream>
#include <ext/hash_set>
using namespace std;
using namespace __gnu_cxx;
struct trip {
int trip_id;
int delta_n;
int delta_secs;
trip(int trip_id, int delta_n, int delta_secs){
this->trip_id = trip_id;
this->delta_n = delta_n;
this->delta_secs = delta_secs;
}
};
struct hash_trip
{
size_t operator()(const trip t)
{
hash<int> H;
return H(t.trip_id);
}
};
struct eq_trip
{
bool operator()(const trip t1, const trip t2) {
return (t1.trip_id==t2.trip_id) &&
(t1.delta_n==t2.delta_n) &&
(t1.delta_secs==t2.delta_secs);
}
};
int main()
{
hash_set<trip, hash_trip, eq_trip> trips;
trip t = trip(3,2,-1);
trip t1 = trip(3,2,0);
trips.insert(t);
}
when I try to compile it, I get the following error message:
当我尝试编译它时,我收到以下错误消息:
/usr/include/c++/4.2.1/ext/hashtable.h: In member function ‘size_t __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::_M_bkt_num_key(const _Key&, size_t) const [with _Val = trip, _Key = trip, _HashFcn = hash_trip, _ExtractKey = std::_Identity<trip>, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]':
/usr/include/c++/4.2.1/ext/hashtable.h:599: instantiated from ‘size_t __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::_M_bkt_num(const _Val&, size_t) const [with _Val = trip, _Key = trip, _HashFcn = hash_trip, _ExtractKey = std::_Identity<trip>, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]'
/usr/include/c++/4.2.1/ext/hashtable.h:1006: instantiated from ‘void __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::resize(size_t) [with _Val = trip, _Key = trip, _HashFcn = hash_trip, _ExtractKey = std::_Identity<trip>, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]'
/usr/include/c++/4.2.1/ext/hashtable.h:437: instantiated from ‘std::pair<__gnu_cxx::_Hashtable_iterator<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>, bool> __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::insert_unique(const _Val&) [with _Val = trip, _Key = trip, _HashFcn = hash_trip, _ExtractKey = std::_Identity<trip>, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]'
/usr/include/c++/4.2.1/ext/hash_set:197: instantiated from ‘std::pair<typename __gnu_cxx::hashtable<_Value, _Value, _HashFcn, std::_Identity<_Value>, _EqualKey, _Alloc>::const_iterator, bool> __gnu_cxx::hash_set<_Value, _HashFcn, _EqualKey, _Alloc>::insert(const typename __gnu_cxx::hashtable<_Value, _Value, _HashFcn, std::_Identity<_Value>, _EqualKey, _Alloc>::value_type&) [with _Value = trip, _HashFcn = hash_trip, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]'
try.cpp:45: instantiated from here
/usr/include/c++/4.2.1/ext/hashtable.h:595: error: passing ‘const hash_trip' as ‘this' argument of ‘size_t hash_trip::operator()(trip)' discards qualifiers
What am I doing wrong?
我究竟做错了什么?
回答by
You should investigate using the STL's TR1 extension namely
您应该调查使用 STL 的 TR1 扩展即
- unordered_map
- unordered_set
- unordered_multimap
- unordered_mutliset
- unordered_map
- 无序集
- unordered_multimap
- unordered_mutliset
Most modern C++ compilers ship with these extensions, hence there is no need to use a non-standard class such as hash_setetc.
大多数现代 C++ 编译器都带有这些扩展,因此不需要使用非标准类,例如hash_set等。
回答by fbrereto
So close! The last error in your output reveals your hash_trip
routine should be declared const
:
很近!输出中的最后一个错误表明您的hash_trip
例程应该声明const
:
size_t operator()(const trip t) const // note the ending 'const'
{
//...
}
You'll probably need to do the same thing for eq_trip
. Also, I would recommend passing the arguments to these functions by constant reference to avoid an unnecessary copy of the data you're passing:
您可能需要为eq_trip
. 此外,我建议通过常量引用将参数传递给这些函数,以避免不必要的数据副本传递:
size_t operator()(const trip& t) const // note the '&'
{
//...
}