我可以在c ++的map结构中使用vector作为索引吗?

时间:2010-05-07 03:41:33

标签: c++ class stl vector map

我试图做这样的事情,但它没有编译:

class point
{
    public:
        int x;
        int y;
};



int main()
{

    vector<point> vp1;
    vector<point> vp2;
    vector<point> vp3;

    map < vector<point>, int > m;

    m[vp1] = 1;
    m[vp2] = 2;
    m[vp3] = 3;

    map < vector<point>, int >::iterator it;
    for (it=m.begin(); it!=m.end(); it++)
    {
        cout<<m[it->first]<<endl;
    }
    return 0;
}

5 个答案:

答案 0 :(得分:6)

只要支持std::map(可以定义为独立函数 - 不必是成员),您就可以将任何内容用作operator<的索引类型函数,只要你能用a < ba作为你感兴趣的类型的实例,用通常的语义(反自反,传递,......)写b。或者,您可以传递具有相同语义的二进制函数来代替<,如果这更适合您。

答案 1 :(得分:4)

您可以,但在地图中用作关键字的类型需要具有可比性,可以使用operator<,也可以使用您提供的比较函数/仿函数作为地图类型的第三个模板参数。

答案 2 :(得分:1)

是的,你可以。像所有容器一样,载体具有可比性。生成的map将按字典顺序对向量进行排序。

问题是point无法比较。您必须为points定义排序顺序,然后依次定义vector<point>上的字典顺序。

class point
{
    public:
        int x;
        int y;
};

bool operator<( point const &l, point const &r ) {
    return l.x < r.x? true
         : r.x < l.x? false
         : l.y < r.y;
}

更简单的解决方案是使用std::pair而不是定义自己的point

typedef pair< int, int > point; // point::first = x, point::second = y
   // pair is already comparable; order defined as in previous example
typedef vector<point> pointvec; // OK

答案 3 :(得分:0)

您尚未定义一个函数来比较vector<point>地图对等效和比较的密钥检查的要求。

答案 4 :(得分:-1)

您必须声明operator<。它看起来像这样(请记住,示例代码中的三个向量实际上看起来一样):

bool operator<(const vector<point>& left, const vector<point>& right)
{
    return left.size() < right.size();
}