我尝试这样做,但它不能编译:
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;
}发布于 2010-05-07 11:46:37
您可以使用任何内容作为std::map的索引类型,只要它支持具有常用语义(反自反、传递等)的operator< (可以定义为独立函数--不一定是成员函数,只要您可以为您感兴趣的类型的实例的a和b编写a < b )。或者,您可以传递一个具有相同语义的二进制函数来代替<,如果它更适合您的话。
发布于 2010-05-07 11:45:58
您可以这样做,但是在映射中用作键的类型必须是可比较的,要么使用operator<,要么使用您提供的比较函数/函数器作为映射类型的第三个模板参数。
发布于 2010-05-08 07:12:35
可以,停那儿吧。向量,就像所有的容器一样,是可比较的。生成的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; // OKhttps://stackoverflow.com/questions/2786054
复制相似问题