如何在C ++中对包含动态数组的结构数组进行排序?

时间:2012-10-22 09:21:42

标签: c++ algorithm sorting struct

这是我的结构:

struct animal
{
    int position;
    int** shape;
    int rows, cols;
    int force;
    int minSafety;
    void init(int r,int c,int k, int t, int p)
    {
        shape = new int*[r];
        for(int i = 0; i < r; i++)
        {
            shape[i] = new int[c];
        }
        rows = r;
        cols = c;
        force = k;
        minSafety = t;
        position = p;
    }
    ~animal()
    {
        for(int i = 0; i < rows; i++)
        {
            delete[] shape[i];
        }
        delete[] shape;
    }
};

我有一个这样的结构数组,我想通过“force”按升序对该数组进行排序。这是我的数组和谓词函数,用于从STL传递给“sort”函数。

bool sortByForce(animal& animal1, animal& animal2)
{
    return animal1.force !=  animal2.force ?
        animal1.force < animal2.force : animal1.rows * animal1.cols > animal2.rows * animal2.cols;
}
animal* animals = new animal[P];
//sort(animals, animals+P, &sortByForce);

当我取消注释sort函数时,代码会中断。我认为这是因为结构内部的动态数组。 (它实际上对数组进行了排序,但“形状”数组在结构中被破坏了。) 谢谢:))

1 个答案:

答案 0 :(得分:2)

正在临时对象上调用析构函数:

animal a;
a.init(...);
{
    animal tmp = a;
} // tmp destructor called, frees memory belonging to a

您需要尊重Rule of Five,方法是编写复制构造函数,移动构造函数,复制赋值运算符和移动赋值运算符,或者将shape替换为托管容器,例如std::vector<std::vector<int>>