我试图做这样的事情,但它没有编译:
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;
}
答案 0 :(得分:6)
只要支持std::map
(可以定义为独立函数 - 不必是成员),您就可以将任何内容用作operator<
的索引类型函数,只要你能用a < b
和a
作为你感兴趣的类型的实例,用通常的语义(反自反,传递,......)写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();
}