Member 13277493 Ответов: 2

Что мне нужно сделать, чтобы вставки работали для массива классов


Мне нужно сделать реализацию для интерфейса отсортированного набора. Любые другие предложения по хорошему и чистому коду были бы великолепны
* 1. size(): возвращает число n элементов в наборе
2. add(x): добавьте элемент x в набор, если он еще не присутствует;
Добавьте x к множеству при условии, что в этом множестве нет элемента y, такого как
что Икс равен игреку. Возвращает true, если x был добавлен в набор, и false
иначе.
3. remove(x): удалить x из набора;
Найдите элемент y в множестве такой, что x равно y, и удалите y.
Возвращает y или null, если такой элемент не существует.
4. find(x): найдите x в отсортированном наборе;
Найдите наименьший элемент y в множестве такой, что y ≥ x. верните y или
null, если такой элемент не существует.*/
<pre>/*
 * 1. size(): return the number, n, of elements in the set
2. add(x): add the element x to the set if not already present;
Add x to the set provided that there is no element y in the set such
that x equals y. Return true if x was added to the set and false
otherwise.
3. remove(x): remove x from the set;
Find an element y in the set such that x equals y and remove y.
Return y, or null if no such element exists.
4. find(x): locate x in the sorted set;
Find the smallest element y in the set such that y ≥ x. Return y or
null if no such element exists.*/
#include <iostream>

class SSet{
private:
    int *arr;
    int size=0;
public:
    void insert(int var);
    void remove(int var);
    int find(int *arr, int left, int right, int value);
    int getSize();
    SSet()
    {
        arr=new int;
    }
    SSet(const SSet& sset);
    ~SSet()
    {
        delete arr;
    }
};

//resource handle->default memberwise copy is not good
SSet::SSet(const SSet &sset)
{
    int local_size=sset.size;
    for(int i=0; i<local_size; i++)
    {
        arr[i]=sset.arr[i];
    }
}

void SSet::insert(int var) {

    if(size==0)
    {
        arr[0]=var;
        return;
    }

    if (find(arr, 0, size - 1, var) == 1) {
        return;
    } else {
        size++;
        int index = 0;
        while (var < arr[index] && index < size) {
            index++;
        }
        for (index; index < size; index++) {
            arr[index + 1] = arr[index];
        }
    }

}

void SSet::remove(int var)
{
    int index=0;
    if(find(arr, 0, size, var))
    {
        size--;

        for (index = 0; index < size; index++)
        {
            if (arr[index] == var)
            {
                for (index; index < size; index++)
                    arr[index] = arr[index + 1];
                return;
            }
        }
    }

    else{
        return;
    }
}

int SSet::find(int *arr, int left, int right, int value)
{
    if (right >= left)
    {
        int middle = left+(right-left)/2;
        if (arr[middle] == value)
        {
            return middle;
        }
        if (value < arr[middle])
        {
            find(arr, left, middle - 1, value);
        }
        else
        {
            find(arr, middle+1, right, value);
        }
    }
    return -1; //not found
}
int SSet::getSize()
{
    return size;
}

int main()
{
    SSet s_set;
    int *arr=new int;
    s_set.insert(5);
    s_set.insert(7);
    s_set.insert(3);

    int size=s_set.getSize();
    for(int i=0; i<3; i++)
    {
        std::cout<<arr[i]<<" ";
    }

    int searchFor;
    std::cin>>searchFor;
    std::cout<<s_set.find(arr, 0, size, searchFor);


    delete[] arr;
}


Что я уже пробовал:

Я искал в Google, чтобы найти путь, но я думал, что будет гораздо быстрее узнать правильный путь, спросив себя

2 Ответов

Рейтинг:
11

OriginalGriff

Хм.
Подумайте о том, что ваш код будет делать в данный момент:

for (index; index < size; index++) {
    arr[index + 1] = arr[index];
}
Предположим, что у вас есть массив из пяти элементов:
A B D E F
И вы хотите вставить букву "С"
Ваш while цикл найдет нужное место: индекс будет равен 2, когда он выйдет.
Но что происходит каждый раз вокруг петли:
Первый ход:
A B D D F

Второй заход:
A B D D D

Третий ход:
A B D D D ARRGH!
Как он сбегает с конца...
И вы никогда не вставляете var вообще.
Вы можете так вставлять вставки с помощью простой петли, но вы должны делать это осторожно:
1) var = 'C'
2) temp = array[index];
3) array[index] = var;
4) var = temp;
5) index++;
6) repeat from (2) until out of elements.


Я бы также посоветовал вам проверить наличие избыточного и недостаточного запуска вашего массива.
И у вас очень скоро будут реальные проблемы, если вы не увеличите пространство, которое вы выделяете для arr - одного целого числа будет недостаточно...


Member 13277493

Спасибо!

OriginalGriff

Всегда пожалуйста!

OriginalGriff

Просто чтобы вы знали: Расширенная версия нуждается только в одном цикле: начиная с хвостового конца и работая в обратном направлении, вам не нужна временная переменная.

Member 13277493

спасибо, я подумаю об этом

Рейтинг:
0

Rick York

Одна ошибка, которую я вижу в вашем коде, заключается в распределении массива. Вы не даете ему размер. Обычно это делается так :

int *arr=new int[arraySize];
// more code here
delete[] arr;
Размер массива должен быть передан распределителю.