Мне нужно реализовать функцию resize ():
void IntSet::resize(int new_capacity)
{
if (new_capacity < used)
new_capacity = used;
if (used == 0)
new_capacity = 1;
capacity = new_capacity;
int * newData = new int[capacity];
for (int i = 0; i < used; ++i)
newData[i] = data[i];
delete [] data;
data = newData;
}
внутри функции:
IntSet IntSet::unionWith(const IntSet& otherIntSet) const
{
IntSet unionSet = otherIntSet;
for (int i = 0; i < used; i++)
{
if (unionSet.contains(data[i]))
unionSet.add(data[i]);
}
return unionSet;
}
и этот: (ПРИМЕЧАНИЕ: это у меня уже есть внутри функции add (), но я думаю, что это неправильно)
bool IntSet::add(int anInt)
{
if (contains(anInt) == false)
{
if (used >= capacity)
resize(used++);
data[used++] = anInt;
return true;
}
return false;
}
Программа правильно компилируется без ошибок, но выдает ошибку Ошибка сегментации
ПРИМЕЧАНИЕ. Главное, что мне нужна помощь в изучении того, как использовать функцию изменения размера для изменения размера вместимость данных динамического члена. Кроме того, я знаю, что векторы помогут в этом случае, но нам еще не разрешено использовать векторы
Здесь Специальные требования от профессора:
>Special Requirement (You will lose points if you don't observe this.) <br/>
>When calling resize *(while implementing some of the member functions)* to
>increase the capacity of the dynamic arrays, use the following resizing
>rule (unless the new capacity has to be something else higher as dictated
>by other >overriding factors): <br/>
>
>*"new capacity" is "roughly 1.5 x old capacity" and at least "old capacity
> + 1".* <br/>
>
>The latter *(at least " old capacity + 1 ")* is a simple way to take care
>of the subtle case where " 1.5 x old capacity " evaluates (with truncation)
>to the >same as "old capacity". <br/>
Когда ты resize
потому что add
Вы увеличиваете used
дважды.
bool IntSet::add(int anInt)
{
if (contains(anInt) == false)
{
if (used >= capacity)
resize(used++); // Here And this is a post increment.
// resize will be called with used before the increment
// so you will wind up asking for a buffer the same size.
data[used++] = anInt; // and here.
return true;
}
return false;
}
Так что ничего не входит в употребление. Вы пропускаете пробел и пишете в пробел после. плюс resize(used++);
Я не просил больше места, так что вы фактически пишете два места за пределами выделенного хранилища, и это, вероятно, вызывает segfault.
Решение
Вы не хотите увеличивать что-либо в resize(used++);
, Вы хотите добавить один к capacity
, но не увеличивайте его, так
resize(capacity +1);
Смотрится правильно. Однако, то, что просили инструкции, является чем-то большим:
int newcap = capacity * 1.5;
if (newcap == capacity) // newcap didn't change. eg: 1*1.5 = 1
{
newcap ++;
}
resize(newcap);
Это грубая сила, хотя. Есть более разумные способы сделать это.
Других решений пока нет …