我是否需要在K类上使用std :: map <k,l =“”> </k,>

时间:2012-10-16 13:33:37

标签: c++ class map std

  

可能重复:
  What requirements must std::map key classes meet to be valid keys?

我想使用std::map作为我班级的地图到另一个。如果我尝试以下代码,则会收到错误“undefined operator <”。这是否意味着我需要在课程K上进行排序才能使用map?它必须是完整的订购吗?我是否需要所有四个排序运算符或>是否足够?

#include <iostream>
#include <map>
#include <stdio.h>
using namespace std;

struct K {
    int i, j;

    K(int i, int j) : i(i), j(j){}

    friend bool operator==(const K& x, const K& y){ return (x.i==y.i)&&(x.j==y.j); }
    friend bool operator!=(const K& x, const K& y){ return !(x==y); }

/*  friend bool operator<(const K&x, const K&y){
        if(x.i<y.i) return true;
        if(x.i>y.i) return false;
        return x.j<y.j;
    }
    friend bool operator>(const K&x, const K&y){ return y<x; }
    friend bool operator<=(const K&x, const K&y){ return !(y<x); }
    friend bool operator>=(const K&x, const K&y){ return !(x<y); }
*/
};


int main(){
    map<K, float> m;
    m[K(1,2)]=5.4;
    if(m.find(K(1,2))!=m.end())
        cout << "Found: " << m[K(1,2)] << endl;
    else
        cout << "Not found" << endl;
    return 0;
}

4 个答案:

答案 0 :(得分:5)

,您需要一种方法来比较元素(operator<)以便使用std :: map。 map的一个特性是它以排序顺序保存其内容,但要实现这一点,需要知道如何比较项目。

您有三种方法可以实现比较方法:

  1. 在K
  2. 中添加operator<定义
  3. 制作一个comp仿函数,知道如何比较两个K元素并将其添加为模板参数map<K, float, comp> m;

    struct comp {
        bool operator()(const K& first, const K& second) {
            /*****/
        }
    };
    
  4. 您可以为K

    定义std :: less专门化
    template<>  struct less<K>
    {
        bool operator()(const K& first, const K& second) {
            /*****/
        }
    };
    
  5. 简单使用map<K, float> m;

    这是有效的,因为map的模板定义将compare函数设置为std :: less。

      

    模板&lt; class Key,class T, class Compare = less ,              class Allocator = allocator&gt; &GT;班级地图

答案 1 :(得分:4)

地图中的元素由您提供的Key类型上的比较函数引用。 隐式为std::less或明确为third template argument

如果使用自定义键类型,则还需要提供适当的比较功能(或功能对象),在键上施加strict weak ordering。 也就是说,如果键看起来相等

!(key1 < key2 || key2 < key1)

这些项目被认为是等效的。

因此,如果您的比较函数仅在键上提供partial order,则可以认为元素实际上是不同的,因此它们的值可能会相互干扰。

答案 2 :(得分:0)

只需定义operator<

即可

std::map命令的目的,其他所有内容都是不必要的。

答案 3 :(得分:-2)

std :: map只需要一个运算符&lt;。实现通常采用“红黑”树,其可以构建为仅需要&lt;运营商。

但是你可以使用std :: unordered_map。它通常使用通用散列函数;如果适合自C ++ 11以来的问题空间,你可以自由地为它提供自己的哈希函数。