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