Как реализовать resize () для изменения емкости данных динамического члена в переполнении стека

Мне нужно реализовать функцию 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/>

1

Решение

Когда ты 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);

Это грубая сила, хотя. Есть более разумные способы сделать это.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector