の順序を効率的に定義する必要がありますstd::set<Edge>
。エッジは、グラフのエッジを表します(マルチグラフではありません)。
class Edge
{
friend class Graph;
string from;
string to;
EdgeInfo edge_length; //constructor is `EdgeInfo(int edge_length)`
public:
bool operator==(const Edge& rhs) {
return (from==rhs.from && to==rhs.to);
}
};
問題は効率的に見つけることです
std::set<Edge>
に「from」と「to」が指定されたエッジが含まれているかどうか- 指定された「from」からいくつかの「to」に移動するエッジ。「to」は指定された内部にありません。
set<string>
とを使用std::set.count()
しstd::set.find()
ます。で適切な順序を定義する必要がありますstd::set
。これは可能ですか?
編集:私は私が使用するべきだった、map
またはmultimap
の代わりに考えましset
た。最終的に私は使用しmap
ました。このソリューションは、@tomの使用提案に触発されていますmap of maps
。
解決策:
typedef int EdgeInfo; //just for the sake of this example (EdgeInfo can be length,price,...)
map< string, map<string, EdgeInfo> > edges;
std::set<Edge>
に「from」と「to」が指定されたエッジが含まれているかどうか
if (edges.count(from)!=0 && edges[from].count(to)!=0) {
return true;
}
または関数がconst
if (edges.count(from)!=0 && ((edges.find(top.second))->second).count(to)!=0) {
return true;
}
指定された「from」からいくつかの「to」に移動するエッジ。「to」は指定されたセット内にありません。
関数がconst
//if there are any edges from "from"
if (edges.count(from)!=0) {
//iterate over all edges from "from"
for (map<string,EdgeInfo>::const_iterator
edge=((edges.find(from))->second).begin();
edge!=((edges.find(from))->second).end();
++edge) {
//if the edge goes to some vertex V that has not been discarded
if (discarded.count(edge->first)==0) { //edge->first means "to"