C++ 计算图中节点的出度
我已经为Graph实现了以下代码。用于计算任何节点的outdegree,存在outdegree函数。它将采用需要计算其outDegree的节点的名称。我想知道在计算任何节点的outDegree时,是否可以使用vector中提供的find()函数。如果是,如何进行C++ 计算图中节点的出度,c++,C++,我已经为Graph实现了以下代码。用于计算任何节点的outdegree,存在outdegree函数。它将采用需要计算其outDegree的节点的名称。我想知道在计算任何节点的outDegree时,是否可以使用vector中提供的find()函数。如果是,如何进行 #include<iostream> #include<iterator> #include<vector> #include<list> usin
#include<iostream>
#include<iterator>
#include<vector>
#include<list>
using namespace std;
template<class T1,class T2>
class Edge{
public:
T1 d_vertex;
T2 d_weight;
Edge(T1,T2);
T1 vertex();
T2 weight();
};
template<class T1,class T2>
Edge<T1,T2>::Edge(T1 v,T2 w):d_vertex(v),d_weight(w){
}
template<class T1,class T2>
T1 Edge<T1,T2>:: vertex(){
return d_vertex;
}
template<class T1,class T2>
T2 Edge<T1,T2>::weight(){
return d_weight;
}
template<class T,class T2>
class Graph{
vector<pair<T, list<T2> > > node;
public:
void addNode(T data,const list<T2>&);
void show();
int outDegree(T);
};
////////////////////////////////////////////////////////////////////
template<class T,class T2>
int Graph<T,T2>::outDegree(T node_name){
for(int i=0;i<node.size();i++){
if(node[i].first==node_name)
break;
}
if(i==node.size())
return -1;
else
return(node[i].second.size());
}
template<class T,class T2>
void Graph<T,T2>:: addNode(T data, const list<T2>& lst){
node.push_back(pair<T, list<T2> >(data,lst));
}
template<class T,class T2>
void Graph<T,T2>:: show(){
for(int i=0;i<node.size();i++){
cout<<node[i].first<<"------ ";
for(typename list<T2> :: iterator it=node[i].second.begin();it!=node[i].second.end();it++)
cout<<(*it).d_vertex<<" ";
cout<<endl;
}
}
int main(){
Graph<int,Edge<int,float> > g;
list<Edge<int,float> > x;
x.push_back(Edge<int,float>(4,float(3.5)));
x.push_back(Edge<int,float>(5,float(4.0)));
g.addNode(3,x);
list<Edge<int,float> > y;
y.push_back(Edge<int,float>(4,float(6.3)));
y.push_back(Edge<int,float>(2,float(12.0)));
y.push_back(Edge<int,float>(1,float(2.1)));
g.addNode(6,y);
g.show();
cout<<g.outDegree(6);
}
#包括
#包括
#包括
#包括
使用名称空间std;
模板
阶级边缘{
公众:
T1 d_顶点;
t2d_重量;
边缘(T1,T2);
T1顶点();
T2重量();
};
模板
边::边(T1 v,T2 w):d_顶点(v),d_权重(w){
}
模板
T1边::顶点(){
返回d_顶点;
}
模板
T2边::权重(){
返回d_权重;
}
模板
类图{
向量节点;
公众:
void addNode(T数据、常量列表&);
void show();
内倾超度数(T);
};
////////////////////////////////////////////////////////////////////
模板
int图::outDegree(T节点名称){
对于(int i=0;i那么,如果使用C++11,则可以使用find_if和lambda:
#include <algorithm>
template<class T,class T2>
int Graph<T,T2>::outDegree(T node_name)
{
typename vector<pair<T, list<T2> > >::const_iterator it
= std::find_if(node.begin(), node.end(),
[&node_name](const pair<T, list<T2> > &n)
{
return n.first ==node_name;
});
if(it != node.end())
return it->second.size();
return -1;
}
#include)或类似的东西。使用find\u是否会比我在代码中所做的更有效?不,在最坏的情况下,它必须通过每个顶点…如果使用std::map
可以将其缩小到日志大小,哈希映射可能会更快