C++ std::map密钥类必须满足哪些要求才能成为有效密钥?

C++ std::map密钥类必须满足哪些要求才能成为有效密钥?,c++,stl,map,key,C++,Stl,Map,Key,我想把一个给定类的对象映射到另一个类的对象。但是,我想用作键的类不是我写的,它是一个简单的结构,只有几个值。map命令它的内容,我想知道它是如何做到的,是否有任意类可以用作键,或者是否有一组需要定义的需求(操作符等等) 如果是这样,我可以为实现操作符映射使用的类创建一个包装器。我只需要知道我首先需要实现什么,并且我没有为类指定任何引用。与set相同:类必须按照“小于”的精神进行严格排序。或者重载一个适当的操作符答案实际上在您链接的引用中,在“Compare”模板参数的描述下 唯一的要求是Comp

我想把一个给定类的对象映射到另一个类的对象。但是,我想用作键的类不是我写的,它是一个简单的
结构,只有几个值。map命令它的内容,我想知道它是如何做到的,是否有任意类可以用作键,或者是否有一组需要定义的需求(操作符等等)


如果是这样,我可以为实现操作符映射使用的类创建一个包装器。我只需要知道我首先需要实现什么,并且我没有为类指定任何引用。

set
相同:类必须按照“小于”的精神进行严格排序。或者重载一个适当的
操作符答案实际上在您链接的引用中,在“Compare”模板参数的描述下


唯一的要求是
Compare
(默认为
less
,默认为使用
操作符您需要定义操作符键所需的一切是它可以复制和分配。
映射内的顺序由
模板(以及构造函数的参数,如果使用)

默认值为
std::less
,默认值为
,这是一个糟糕的比较运算符。不仅糟糕,而且错误。它没有提供映射容器所需的“严格弱排序”。提供了上述暴力版本以进行补偿。比较a(5,“a”)和a(5,“B”)之间的差异是的,我想发布一个简单的例子,结果搞砸了。感谢Martin修复了这个例子。+1事实上,真正的需求是可复制和可分配的。为什么“最好是作为函数对象”.为什么不在候选类上添加操作符<呢?诚然,OP不能控制类,所以不能添加操作符,但在我的情况下,这是可能的。添加比较操作符是否不可取,如果不可取,原因是什么?@nurdglaw我最近看到一次演讲,其中一位大师大声疾呼要提供<代码>operator@nurdglaw无论如何,可能是t他“最好是作为函数对象”指的是其他备选方案:(命名)成员方法或自由函数
struct A
{
  int a;
  std::string b;
};

// Simple but wrong as it does not provide the strict weak ordering.    
// As A(5,"a") and A(5,"b") would be considered equal using this function.
bool operator<(const A& l, const A& r )
{
  return ( l.a < r.a ) && ( l.b < r.b );
}

// Better brute force.
bool operator<(const A& l, const A& r )
{ 
    if ( l.a < r.a )  return true;
    if ( l.a > r.a )  return false;

    // Otherwise a are equal
    if ( l.b < r.b )  return true;
    if ( l.b > r.b )  return false;

    // Otherwise both are equal
    return false;
}

// This can often be seen written as
bool operator<(const A& l, const A& r )
{
   // This is fine for a small number of members.
   // But I prefer the brute force approach when you start to get lots of members.
   return ( l.a < r.a ) ||
          (( l.a == r.a) && ( l.b < r.b ));
}
struct CmpMyType
{
    bool operator()( MyType const& lhs, MyType const& rhs ) const
    {
        //  ...
    }
};