0

可能重复:
使用我自己的函数进行 C++ 向量排序

C++ 自由函数。向量排序和问题

我尝试根据我最近从这里的一位专家那里收到的回复创建一个免费函数。

我所做的是在我的 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 个父类和 2 个子类

Parent: Vehicle
Child: Car & Lorry

汽车和货车有一个

private: 
double area;
public:
double getArea();

我想要实现的目标

我正在尝试通过 compareByArea 对向量进行排序,其中较小的区域将在最高处排序,而较大的 1 将在底部。

问题是 getArea 是 Car & Lorry (子类)的函数,我在 main.cpp 创建了这个 compareByArea

sortVector 是 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)

感谢大家的帮助!!

4

3 回答 3

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;
}
于 2012-10-30T19:59:28.217 回答
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成为模板吗?它使事情复杂化,但不能解决代码中的任何问题。

于 2012-10-30T20:00:24.190 回答
-1

sort(sortVector.begin(), sortVector.end(), sortVector[0].compareArea);是不正确的。

您可以通过切换到

sort(sortVector.begin(), sortVector.end(), &compareArea<decltype(*sortVector.begin())>);

更好的解决方法是问问自己是否需要模板,因为看起来您只是在比较一种已知类型。

于 2012-10-30T19:36:00.053 回答