C++ 计算图中节点的出度

C++ 计算图中节点的出度,c++,C++,我已经为Graph实现了以下代码。用于计算任何节点的outdegree,存在outdegree函数。它将采用需要计算其outDegree的节点的名称。我想知道在计算任何节点的outDegree时,是否可以使用vector中提供的find()函数。如果是,如何进行 #include<iostream> #include<iterator> #include<vector> #include<list> usin

我已经为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);
}
#包括
#包括
#包括
#包括
使用名称空间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
可以将其缩小到日志大小,哈希映射可能会更快