首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在c++的地图结构中使用矢量作为索引吗?

我可以在c++的地图结构中使用矢量作为索引吗?
EN

Stack Overflow用户
提问于 2010-05-07 11:41:33
回答 5查看 802关注 0票数 2

我尝试这样做,但它不能编译:

代码语言:javascript
复制
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;
}
EN

回答 5

Stack Overflow用户

发布于 2010-05-07 11:46:37

您可以使用任何内容作为std::map的索引类型,只要它支持具有常用语义(反自反、传递等)的operator< (可以定义为独立函数--不一定是成员函数,只要您可以为您感兴趣的类型的实例的ab编写a < b )。或者,您可以传递一个具有相同语义的二进制函数来代替<,如果它更适合您的话。

票数 6
EN

Stack Overflow用户

发布于 2010-05-07 11:45:58

您可以这样做,但是在映射中用作键的类型必须是可比较的,要么使用operator<,要么使用您提供的比较函数/函数器作为映射类型的第三个模板参数。

票数 4
EN

Stack Overflow用户

发布于 2010-05-08 07:12:35

可以,停那儿吧。向量,就像所有的容器一样,是可比较的。生成的map将按字典顺序对向量进行排序。

问题是point不具有可比性。您必须为points定义一个排序顺序,然后这将在vector<point>上定义字典顺序。

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2786054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档