在Graph中计算节点的outdegree

时间:2014-06-26 09:15:21

标签: c++

我已经为Graph实现了以下代码。为计算outdegree函数的任何节点的outdegree存在。它将采用节点的名称,其outDegree需要计算。我想知道在计算任何节点的outDegree时,我可以使用vector中提供的find()函数。如果有,怎么样?

    #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);
}

1 个答案:

答案 0 :(得分:0)

好吧,如果你使用C ++ 11,你可以使用带有lambda的find_if:

#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;
}

作为侧边栏:如果您想高效地使用图表,请使用柠檬(http://lemon.cs.elte.hu/trac/lemon)或类似的东西。