0

重複の可能性:
自分の関数を使用した C++ ベクトルの並べ替え

C++ フリー関数。ベクトルの並べ替えと問題

ここの専門家の 1 人から最近受け取った応答に基づいて、無料の関数ベースを作成しようとしました。

私がしたことは私の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();

私が達成しようとしていること

小さい領域が一番上に並べ替えられ、大きい領域が一番下になります。

問題は、getArea が Car & Lorry (子クラス) の関数であり、main.cpp でこの compareByArea を作成することです。

sortVector は vehicletwod のベクトル コピーです。

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

問題は、 vector of pointersを使用しているが、 の参照を介してオブジェクトにアクセスすることです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>);

しかし、2 回自問してみてください。本当に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())>);

既知の 1 つのタイプのみを比較しているように見えるため、テンプレートが必要かどうかを自問することをお勧めします。

于 2012-10-30T19:36:00.053 に答える