C++ 使用图时将向量传递给函数

C++ 使用图时将向量传递给函数,c++,algorithm,graph,graph-algorithm,C++,Algorithm,Graph,Graph Algorithm,我在一个类中编写了这样的代码来计算从源到节点的最大距离。现在我需要把它从课堂上拿出来,用一个类似的函数来计算我的距离,但是要用Djikstra。所以,我需要传递这个城市向量,源是我的一个顶点(这将在顶点上循环),并返回从这个函数到类的距离,以便下次计算。我没时间了,帮帮我吧 int distanceToNearCity(int cityIdOfStore, const std::vector<City> & AllCities) const { // is there a

我在一个类中编写了这样的代码来计算从源到节点的最大距离。现在我需要把它从课堂上拿出来,用一个类似的函数来计算我的距离,但是要用Djikstra。所以,我需要传递这个城市向量,源是我的一个顶点(这将在顶点上循环),并返回从这个函数到类的距离,以便下次计算。我没时间了,帮帮我吧

int distanceToNearCity(int cityIdOfStore, const std::vector<City> & AllCities) const
{
  // is there a store in this city ?
  if (storeExists || cityId == cityIdOfProposedNewStore)
  {
     return 0; // 0 distance
  }

  int distance = TOOFAR; // initialise with more than max allowed
  for (int i=0; i<connectingCities.size(); ++i)
  {
     int id = connectingCities[i];
     if (AllCities[id-1].hasStore() || AllCities[id-1].getId() == cityIdOfProposedNewStore)
     {
       // we have a store (or proposed one) here, but is it's distance more than other stores ?
       if (distances[i] < distance)
       {
          distance = distances[i];
       }
     }
  }

  return distance;
}
int distanceToNearCity(int cityIdOfStore,const std::vector&AllCities)const
{
//这个城市有商店吗?
if(storeExists | | cityId==cityIdOfProposedNewStore)
{
返回0;//0距离
}
int distance=TOOFAR;//使用超过允许的最大值初始化

对于(inti=0;i那么,从main访问内部成员变量可能是一个糟糕的设计,破坏了封装,可能是问题的根源,因此不是一个好主意

解决方案1 假设您的类名为MyOriginal。将
distanceToNearCity
设置为虚拟。创建一个派生类
MyOriginal
,并重写
distanceToNearCity
,以便实现Djikstra。在派生类中,您可以从
MyOriginal
访问原始成员变量,只要它们是公共的或受保护的。T用户(main)不需要知道实现细节

解决方案2 重写原始的
distanceToNearCity
方法,使其作为静态方法没有副作用。这意味着它不需要访问任何成员变量。通过参数将所有参数传递给该方法。我提到了“因为它是静态方法”,因为该方法将不是原始MyOrigin的成员al类。使
MyOriginal
成为模板类,在外部类中实现
distanceToNearCity
,并将该类作为模板参数传递给
MyOriginal
。作为非成员,您可以实现任意数量的距离算法并将其传递给原始类。此解决方案的优点是“virtual”方法在编译时是已知的,因此它可以生成更快的代码

template<class T> // T will contain distance computation
class MyOriginal
{
public:
  void process()
  {
    .. // your staff
    int distance = T::distanceToNearCity(necessary arguments); // call the external implementation
    .. // rest of your staff
  }
};
class OriginalDistance
{
public: 
  static int distanceToNearCity(necessary arguments); // your original implementation
};
class DjikstraDistance
{
public: 
  static int distanceToNearCity(necessary arguments); // another distance computation
};

int main(int argc, char *argv[])
{
  MyOriginal<DjikstraDistance> myInstance;
  myInstance.process(); // call processing, use DjikstraDistance::distanceToNearCity() inside
}

当你说你需要把它从类中去掉时,你的意思是你需要把它变成一个静态/全局函数吗?我不清楚你的问题到底是什么。是的。因为我需要我的图的每个顶点值来从main访问它。我想把它变成全局的。我试图用Dijkstra来解决所有对的距离。所以,当我有了一个新的源时循环我可以在函数调用中使用它。让
distanceToNearCity
虚拟,从当前类派生并重新定义距离算法怎么样?你想1)让它成为一个非成员函数,2)将算法改为Dijkstra。你想在哪一个方面得到帮助?@Beta我需要这两个方面的帮助。专注于(1)我需要知道如何将参数传递给这个非成员函数。
typedef int (DistanceAlgo*)(necessary arguments); // pointer to a function which returns int
int distanceToNearCityOriginal(necessary arguments); // first implementation of distance
int distanceToNearCityDjikstra(necessary arguments); // second implementation of distance
class MyOriginal
{
public:
  void process(DistanceAlgo algo)
  {
    .. // your staff
    int distance = (*algo)(necessary arguments); // call the external implementation
    .. // rest of your staff
  }
};
int main(int argc, char *argv[])
{
  DistanceAlgo algo = &distanceToNearCityDjikstra; // choose djikstra
  MyOriginal myInstance;
  myInstance.process(algo); // call processing, use distanceToNearCityDjikstra inside
}