我需要有效地在std::set<Edge>
. 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
ormultimap
而不是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"