質問
マップにペア値を挿入しようとしています。 MAM 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にコンパレータを提供する必要があります。私の推測では、MAPにデフォルトのコンパレータを使用していると思います。たとえば、キーのアドレスを比較します。これは常に同じです。 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;