0

私はこのクラスを持っています

Class VehicleTwoD
{
private:
doubleArea;
}

だから私はdoubleAreaでソートしたい。

私のmain.cppで

私は得た

int main()
{
VehicleTwoD *vehicletwod[100];
sort(vehicletwod[0], vehicletwod[vehicleCounter]);

for (int i=0;i<vehicleCounter;vehicleCounter++)
    {
cout << "Vehicle " << i << end;
cout << vehicletwod[i]->toDisplay() << endl;
    }
}

Below is my operator overload at Vehicle.h


bool VehicleTwoD::operator<(const VehicleTwoD& rhs) const
{
return area > rhs.area;
}

プログラムを実行しようとすると、実行時にエラーが発生します - セグメンテーション コア ダンプ エラーです。

Vehicle Counter に問題がなく、Vehicletwod がディスプレイに実行しようとしたときに少なくとも 2 つのオブジェクトを取得したと仮定すると、実際に何が問題になったのか..

アップデート:

ここで専門家から受け取った貴重なフィードバックのおかげで、これを行いました。

main.cpp で

int main()
{
VehicleTwoD *vehicletwod[100];

for(int i=0;i<100;i++)
{
vehicletwod[i] = new VehicleTWoD();
}

//some computation then I go to sort..

sort(&vehicletwod[0],&vehicletwod[vehicleCounter]);

for(int i=0;i<vehicleCounter;i++)
{
cout << vehicletwod->toDisplay() << endl;
}

}

出力は同じままで、何もソートされていません..理由はわかりません..

これは、VehicleTwoD.h で行ったブール演算子です。

VehicleTwoD.h

public:
bool operator<(const VehicleTwoD&) const;

VehicleTwoD.cpp

bool VehicleTwoD::operator<(const VehicleTwoD& rhs) const
{
return area > rhs.area;
}

何もソートされていません..少なくとも降順または昇順でソートされることを願っています..

昇順で並べ替えた後、降順でも並べ替えたいので、VehicleTwoD 配列をベクトル呼び出し sortVector に割り当てる方法があるかどうか疑問に思いました。

したがって、ベクトルの逆関数はそれを解決するのに適しています。

なにか提案を ?ここにいる親切で親切な専門家の皆さんに感謝します!!

4

4 に答える 4

3
VehicleTwoD *vehicletwod[100];

これは、無効なメモリ位置を指す参照の配列を作成するだけです。

100 個の有効な参照を割り当てるには、ループまたは別の方法が必要です。例:

for(int i=0;i < 100;i++)
{
  vehicletwod[i] = new VehicleTwoD() ;
}

そして、それらのメモリを解放することを忘れないでください。

于 2012-10-31T09:32:19.067 に答える
2

あなたのプログラムには間違っていることがたくさんあります。

VehicleTwoD *vehicletwod[100];

への 100 個の初期化されていないポインタの配列を作成しますVehicleTwoD

sort(vehicletwod[0], vehicletwod[vehicleCounter]);

2 つのポインタで定義された範囲をソートしvehicletwod[0]ますvehicletwod[vehicleCounter]。配列が初期化されていないため、これらのポインターはガベージであるため、並べ替えによってメモリが破損します。

次のものが必要な場合があります

std::vector<VehicleTwoD> vehicletwod; // vector of instances
// initialize the vector
// ...
sort(vehicletwod.begin(), vehicletwod.end()); 
于 2012-10-31T09:34:05.230 に答える
2

他の人が言ったことに追加するには、コンパイル可能な例を次に示します(逆ソート用に更新/静的クラス比較関数用に更新):

< 演算子をオーバーロードする代わりに、たとえば以下に示すように静的比較子を指定するなどして、並べ替え方向を明示的にすることを検討したい場合があります。意図を文書化できるため、このオプションをお勧めします。

Vehicle.h:

#include <random>
class VehicleTwoD
{

    private:
        double area;
    public:
        VehicleTwoD() 
        {
            area = ((double)rand()/(double)RAND_MAX);
        }

        double toDisplay()
        {
            return area;
        }

        bool VehicleTwoD::operator<(const VehicleTwoD& rhs) const
        {
            return area > rhs.area;
        }
        static bool VehicleTwoD::greater(const VehicleTwoD &lhs, const VehicleTwoD &rhs) 
        {
            return lhs.area > rhs.area;
        }

        static bool VehicleTwoD::lesser(const VehicleTwoD &lhs, const VehicleTwoD &rhs) 
        {
            return lhs.area < rhs.area;
        }

};

そしてmain.cppで:

#include "Vehicle.h"    
#include <vector>
#include <time.h>
#include <algorithm>
#include <iostream>


int main()
{

    srand((unsigned)time(NULL));
    std::vector<VehicleTwoD> vehicles(100);
    std::vector<VehicleTwoD>::iterator it;


    sort(vehicles.begin(), vehicles.end());
    for(it = vehicles.begin();  it != vehicles.end(); it++)
    {
        std::cout << "Vehicle area -> " << it->toDisplay() << std::endl;
    }
    std::cout << "Press any key..." << std::endl;
    std::cin.get();

    // reverse sort - note that rbegin() rend() may be second-class citizens
    // depending on your compiler's implementation and that their use may therefore
    // be limited
    sort(vehicles.rbegin(), vehicles.rend());
    for(it = vehicles.begin();  it != vehicles.end(); it++)
    {
        std::cout << "Vehicle area -> " << it->toDisplay() << std::endl;
    }
    std::cout << "Press any key..." << std::endl;
    std::cin.get();

    // or (document your intention)
    sort(vehicles.begin(), vehicles.end(), VehicleTwoD::greater);
    for(it = vehicles.begin();  it != vehicles.end(); it++)
    {
        std::cout << "Vehicle area -> " << it->toDisplay() << std::endl;
    }
    std::cout << "Press any key..." << std::endl;
    std::cin.get();

    sort(vehicles.begin(), vehicles.end(), VehicleTwoD::lesser);
    for(it = vehicles.begin();  it != vehicles.end(); it++)
    {
        std::cout << "Vehicle area -> " << it->toDisplay() << std::endl;
    }
    std::cout << "Press any key..." << std::endl;
    vehicles.clear();
    std::cin.get();
    return 0;

}
于 2012-10-31T11:01:57.267 に答える
2

まあ、(何であれ)初期化されないvehicletwod[i]->toDisplay()ため、UBです。vehicletwod[i]i

VehicleTwoD *vehicletwod[100];100 個のダングリング ポインターの配列を作成するだけです。

代わりにa を使用することをお勧めしますstd::vector<std::unique_ptr<VehicleTwoD>>(クラスがポリモーフィックであり、ポリモーフィックな動作が必要なため)。

于 2012-10-31T09:33:10.263 に答える