C ++按私有变量排序数组

时间:2012-10-31 09:30:05

标签: c++

我有这个班级

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;
}

当我尝试运行程序时,我在运行时遇到错误 - 分段核心转储错误。

假设我的车辆计数器没有错,当我尝试运行显示时,我的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 个答案:

答案 0 :(得分:3)

VehicleTwoD *vehicletwod[100];

这只会创建一个指向无效内存位置的引用数组。

您需要循环或其他方式来分配100个有效引用。例如:

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

你必须记住释放那些记忆。

答案 1 :(得分:2)

好吧,vehicletwod[i]->toDisplay()是UB,因为vehicletwod[i](无论i是什么)永远不会被初始化。

VehicleTwoD *vehicletwod[100];只创建一个包含100个悬空指针的数组

我建议您使用std::vector<std::unique_ptr<VehicleTwoD>>代替(因为看起来您的类是多态的,并且您需要多态行为)。

答案 2 :(得分:2)

你的程序中有很多错误。

VehicleTwoD *vehicletwod[100];

创建一个包含100个未初始化指针的数组到VehicleTwoD

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

对由两个指针vehicletwod[0]vehicletwod[vehicleCounter]定义的范围进行排序。由于数组未初始化,这些指针是垃圾,因此排序会破坏内存。

您可能需要以下

std::vector<VehicleTwoD> vehicletwod; // vector of instances
// initialize the vector
// ...
sort(vehicletwod.begin(), vehicletwod.end()); 

答案 3 :(得分:2)

添加其他人所说的这是一个可编译的示例(针对反向排序更新/更新为静态类比较函数):

而不是重载&lt;运营商您可能要考虑进行排序 方向显式,例如通过指定静态比较器,如下所示。 我更喜欢这个选项,因为它允许你记录你的意图。

在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;

}