C ++自由功能。矢量排序&问题
我尝试根据最近从1 of the experts here收到的回复创建免费功能。
我做的是在我的main.cpp
我在main.cpp
创建了这个函数template<typename T> bool compareByArea(const T &a, const T &b) {
return a.getArea() < b.getArea();
}
我实际上是在我的main.cpp
sortVector.assign(vehicletwod, vehicletwod + arrayCounter);
sort(sortVector.begin(),sortVector.end(),sortVector[0].compareArea);
有1个家长班&amp;我的课程中有2个孩子课
Parent: Vehicle
Child: Car & Lorry
Car&amp;罗瑞得到了一个
private:
double area;
public:
double getArea();
我想要实现的目标
我试图通过compareByArea对矢量进行排序,较小的区域将排序为最高,而较大的1将位于底部。
问题是getArea是Car&amp; A的功能。 Lorry(子类)我在main.cpp
创建了compareByAreasortVector是vehicletwod的矢量副本
我通过这种方式为我的车辆设置价值的方式......
if(vehicleType=="Car")
{
vehicletwod[arrayCount] = new Car();
vehicletwod[arrayCount].setDimension();
//set area
vehicletwod[arrayCount].setArea();
cout << "Done setting the data";
}
如何按区域升序实现排序。
编译错误:
no matching function for call to 'sort(std::vector<VehicleTwoD*>::iterator, std::vector<VehicleTwoD*>::iterator, <unresolved overloaded function type>)'
note: template<class _RAIter> void std::sort (_RAIter, _RAIter)
note: template<class _RAIter, class _Compare> void std::sort(_RAiter, _RAIter, _Compare)
感谢您的帮助!!
答案 0 :(得分:0)
这是使用免费函数进行排序的一个小例子。它并没有完全反映你的类设计,主要是因为它没有真正意义。如果您要存储指向基类的指针,那么您将需要从该基指针调用GetArea
函数。如果区域存储在每个子节点中,如果它是相同的类型也没有意义,只需将它放在基础中,这样就不会复制代码。
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
class Vehicle
{
public:
Vehicle(double Width, double Height)
: Area(Width*Height) {}
double GetArea() const { return Area; }
private:
double Area;
};
class Lorry : public Vehicle
{
public:
Lorry(double Width, double Height)
: Vehicle(Width, Height) {}
};
class Car : public Vehicle
{
public:
Car(double Width, double Height)
: Vehicle(Width, Height) {}
};
bool CompareVehiclesByArea(const Vehicle* lhs, const Vehicle* rhs)
{
return lhs->GetArea() < rhs->GetArea();
}
typedef std::vector<Vehicle*> VehicleVec;
void PrintVehicles(const std::string& Header, const VehicleVec& Vehicles)
{
std::cout << Header << std::endl;
for(size_t Index = 0; Index < Vehicles.size(); ++Index)
{
std::cout << "Index: " << Index << ", Area: " << Vehicles[Index]->GetArea() << std::endl;
}
}
int main()
{
VehicleVec Vehicles;
Vehicles.push_back(new Car(1.0, 2.0));
Vehicles.push_back(new Car(3.0, 4.0));
Vehicles.push_back(new Lorry(1.5, 2.5));
Vehicles.push_back(new Lorry(3.5, 4.5));
PrintVehicles("Before:", Vehicles);
std::sort(Vehicles.begin(), Vehicles.end(), CompareVehiclesByArea);
PrintVehicles("After:", Vehicles);
//Cleanup omitted for brevity
return 0;
}
答案 1 :(得分:0)
看起来问题是您使用指针的向量,但是通过compareByArea
中的引用访问对象。但它的参数实际上已解析为对对象指针的引用,而不是对对象的引用。
正确的方式:
// Note - parameter types are pointers, not references
template<typename T> bool compareByArea(const T* a, const T* b)
{
return a->getArea() < b->getArea(); // getArea() must be const!
}
typedef std::vector<VehicleTwoD*> VehicleTwoDVec;
// Old good way
sort(sortVector.begin(), sortVector.end(),
&compareByArea<VehicleTwoDVec::value_type>);
// "Advanced" C++11 way
sort(sortVector.begin(), sortVector.end(),
&compareByArea<std::remove_reference<decltype(sortVector.front())>::type>);
但问问自己两次 - 你真的需要compareByArea
成为模板吗?它使事情变得复杂,但没有解决代码中的任何问题。
答案 2 :(得分:-1)
sort(sortVector.begin(), sortVector.end(), sortVector[0].compareArea);
不正确。
你可以通过切换到
来修复它sort(sortVector.begin(), sortVector.end(), &compareArea<decltype(*sortVector.begin())>);
更好的解决方法是问问自己模板是否必要,因为看起来你只是在比较那个已知的类型。