How to use struct as key in std::map
Solution 1
You can define the comparison operator as a freestanding function:
bool operator<(const GUID & Left, const GUID & Right)
{
// comparison logic goes here
}
Or, since in general a < operator does not make much sense for GUIDs, you could instead provide a custom comparison functor as the third argument of the std::map
template:
struct GUIDComparer
{
bool operator()(const GUID & Left, const GUID & Right) const
{
// comparison logic goes here
}
};
// ...
std::map<GUID, GUID, GUIDComparer> mapGUID;
Solution 2
Any type you use as a key has to provide a strict weak ordering. You can supply a comparator type as a third template argument, or you can overload operator<
for your type.
dragan.stepanovic
craft. tdd. xp. design. architecture. ddd/cqrs/es.
Updated on June 04, 2022Comments
-
dragan.stepanovic almost 2 years
I want to use a
std::map
whose key and value elements are structures.I get the following error:
error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'const GUID
I understand that I should overload
operator <
for that case, but the thing is I don't have access to the code of the structure I want to use (GUID
structure in VC++).Here's the code snippet:
//.h #include <map> using namespace std; map<GUID,GUID> mapGUID; //.cpp GUID tempObj1, tempObj2; mapGUID.insert( pair<GUID,GUID>(tempObj1, tempObj2) );
How to solve this problem?