我尝试刷新我(非常有限的)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
),但不知道我在哪里这样做,因为它是同一个类的对象。
答案 0 :(得分:0)
我觉得我需要先向左(和右)创建一个对象,但不知道我在哪里做,因为它是同一个类的对象。
这是对的。在你创建它们之前,它们不能被“使用”,因为它们将是未经初始化的。您应该能够在构造函数中构造和赋值左右,或者在构造函数中将它们初始化为NULL,并在第一次使用之前设置它们,如果它们在那时未设置的话。
请注意,您需要注意不要以导致无限循环的方式构造它们 - 在构造函数中创建一个新实例,然后创建一个新实例,反过来....