0

我尝试刷新我对 C++ 的(非常有限的)知识并尝试实现合并搜索方法:

class Sorter
{
protected:
    vector<int> v;
public:
    Sorter(){};
    Sorter(vector<int> input_vector);
    virtual void sort() = 0;
};    

Sorter::Sorter(vector<int> input_vector)
{
    v.assign(input_vector.begin(), input_vector.end());
}
class MergeSorter : public Sorter
{
public:
        MergeSorter():Sorter(){};
        MergeSorter(vector<int> input_vector):Sorter(input_vector){};
        vector<int> sorted_v;
        MergeSorter* left;
        MergeSorter* right;
        void merge();
        void sort();
};

void MergeSorter::sort()
{
    if(v.size() <= 1)
        return;
    int mid = int(v.size() / 2);
    left->v.assign(v.begin(), v.begin() + mid);
    right->v.assign(v.begin() + mid, v.end() + 1);
    left->sort();
    right->sort();
    left->v.assign(left->sorted_v.begin(), left->sorted_v.end());
    right->v.assign(right->sorted_v.begin(), right->sorted_v.end());
    merge();
    return;
}
...

它确实可以编译,但是当我尝试将某些内容分配给left->v. 我觉得我需要首先实际创建一个对象left(和right),但不知道我在哪里做,因为它是同一类的对象。

4

1 回答 1

0

我觉得我需要先创建一个左(右)对象,但不知道我在哪里做,因为它是同一类的对象。

这是对的。在您创建这些之前,它们不能被“使用”,因为它们将未被初始化。您应该能够在构造函数中进行左右的构造和赋值,或者在构造函数中将它们初始化为 NULL 并在第一次使用之前设置它们(如果此时它们未设置)。

请注意,您需要注意不要以会导致无限循环的方式构造它们 - 在构造函数中创建一个新实例,这反过来又会创建一个新实例,这反过来又......

于 2012-07-09T15:38:55.200 回答