C ++自由功能。矢量排序&问题

时间:2012-10-30 19:18:20

标签: c++

  

可能重复:
  C++ vector sorting with my own Function

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

创建了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)

感谢您的帮助!!

3 个答案:

答案 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())>);

更好的解决方法是问问自己模板是否必要,因为看起来你只是在比较那个已知的类型。