如何在数组内对自定义类对象进行排序

时间:2014-07-12 16:50:35

标签: c++ arrays sorting swap

我想知道如何对包含自定义类对象的数组进行排序。我正在尝试应用不同的排序算法,但在交换时出错了。

这是我的代码:

class RaceCar
{
private:
    char* _brand;
    char* _model;
    double _price;
    int _horse_power;

public:

    //Other code
    RaceCar(const RaceCar& rc):_price(rc._price), _horse_power(rc._horse_power)
    {
         _brand = new char[strlen(rc._brand)+1];
         strcpy(_brand, rc._brand);
         _model = new char[strlen(rc._model)+1];
         strcpy(_model,rc._model);
    }

    RaceCar& operator=(const RaceCar& rc)
    {
        if(this != &rc)
        {
            delete _brand;
            delete _model;
            _brand = new char[strlen(rc._brand)+1];
            strcpy(_brand, rc._brand);
            _model = new char[strlen(rc._model)+1];
            strcpy(_model, rc._model);

            _price = rc._price;
            _horse_power = rc._horse_power;
        }

        return *this;
    }

    bool operator<(const RaceCar& rc)
    {
        return (this->_price/this->_horse_power) > (rc._price/rc._horse_power);
    }

    //Other code
};

这是包含RaceCars数组的类。我正在尝试实现SortCars()方法,该方法对汽车数组中的RaceCar对象进行排序:

class RaceCarGarage
{
private:
    RaceCar* _cars;
    int _max_cars;
    int _curr_occupied;
public:
    RaceCarGarage():_cars(NULL), _max_cars(0),_curr_occupied(0){}
    RaceCarGarage(const RaceCar& car, int max_cars)
    :_max_cars(max_cars), _curr_occupied(0)
    {
        _cars = new RaceCar[_max_cars];
    }
    ~RaceCarGarage()
    {
        delete _cars;
    }

    void AddCar(const RaceCar& car)
    {
        if(_curr_occupied < _max_cars)
        {
            _cars[_curr_occupied] = car;
            _curr_occupied += 1;
        }
    }

    void DisplayCars()
    {
        if(_curr_occupied > 0)
        {
            for(int i=0 ; i<_curr_occupied ; i++)
            {
                cout<<(i+1)<<". ";
                (_cars+i)->Display();
            }
        }
    }

    void SortCars()
    {
        if(_curr_occupied > 1)
        {
            for(int i=0 ; i<_curr_occupied ; i++)
            {
                for(int j = i+1 ; j<_curr_occupied ; j++)
                {
                    if(_cars[j]<_cars[i])
                    {
                        RaceCar buffer = _cars[i];
                     _cars[i] = _cars[j];
                     _cars[j] = buffer;
                    }
                }
            }
        }
    }
};

1 个答案:

答案 0 :(得分:0)

交换的问题在于您使用传统方式:

temp = a        // operator= 
a = b           // operator=
b = temp;       // operator= 

但是,如果你写:

RaceCar temp = a;   // Copy constructor gets called (see comment on standard) 
a = b;          // operator=
b = temp;       // operator= 

默认的复制构造函数,只是按成员复制成员,因此只需复制指针即可。所以最后,你的temp和你的意志会尝试删除指向同一个对象的两倍。

备注初始值设定项:
对于类型T,表单T a = b;中的语句是初始化程序 第12.6.1节第1节中的ISO标准C ++解释了“单个赋值表达式可以使用=初始化形式指定为初始化器。直接初始化语义或复制初始化语义适用;