题
我正在尝试将一些配对值插入地图。 May Map由一个对象和另一个对象的向量组成。我不知道为什么,但是制作编译代码的唯一方法是像指针一样声明第一个对象。但是这样,当我插入一些对象时,只有第一对就放入地图中。
我的地图是:
map<prmEdge,vector<prmNode> > archi;
这是代码:
{
bool prmPlanner::insert_edge(int from,int to,int h) {
prmEdge e;
int f=from;
int t=to;
if(to<from){
f=to;
t=from;
}
e.setFrom(f);
e.setTo(t);
vector<prmNode> app;
prmNode par=nodes[e.getFrom()];
prmNode arr=nodes[e.getTo()];
app.push_back(par);
app.push_back(arr);
archi.insert(pair<prmEdge,vector<prmNode> >(e,app) );
return true;
}
}
这样,我在类对中的编译错误。我能做什么??非常感谢。
解决方案
您需要为Prmedge提供比较器。我的猜测是它使用默认比较器进行映射,例如比较键的地址 - 始终是相同的,因为 e
是本地的。
需要订购用作地图中的钥匙的对象,因此您要么需要提供用于比较边缘的操作员,要么需要提供地图的比较器功能。
class EdgeComparator {
public:
bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
// ... ?
}
};
map<prmEdge,vector<prmNode>, EdgeComparator > archi;
真正困难的部分是决定如何比较边缘,以便定义确定的顺序。假设你只有 from
和 to
您可以尝试:
class EdgeComparator {
public:
bool operator( )( const prmEdge& emp1, const prmEdge& emp2) const {
if ( emp1.from != emp2.from )
return ( emp1.from < emp2.from );
return ( emp1.to < emp2.to );
}
};
它将在主键上排序 from
和次要 to
.
其他提示
班上 prmEdge
需要定义比较功能(默认是 operator<
) 跟...共事 std::map
. 。尽管您不发布该代码,但我希望这是您的问题(对于记录,指针有一个 operator<
定义。
struct A {
int a;
bool operator<(A other)
{
return a < other.a;
}
};
struct B {
int b;
};
bool cmp(B lhs, B rhs)
{
return lhs.b < rhs.b;
}
std::map<A, int> map_a;
std::map<B, int, std::pointer_to_binary_function<B, B, bool> > map_b(std::ptr_fun(cmp));
地图元素由它们的键订购。但是该地图需要知道如何:
要么超载 <
PRMEDGE类的运营商...
class prmEdge
{
//...
public:
bool operator<(const prmEdge& right) const
{
//...
}
};
...或指定地图的比较器:
class Comparator
{
public:
bool operator()(const prmEdge& left, const prmEdge& right) const
{
// ...
}
};
map<prmEdge, vector<prmNode>, Comparator> archi;
不隶属于 StackOverflow