Как вставить в массив? C ++ - PullRequest
1 голос
/ 11 февраля 2012

У меня есть класс шаблонов, который хранит коллекцию объектов, используя массив и текущий размер. Я разобрался со вставкой и вытащил. У меня проблемы с функцией isEmpty. Он возвращает false (как будто он не пустой), даже когда я добавляю, скажем, 3 и 5, а затем удаляю 3 и 5. Затем он должен сказать true.

#include <cstdio>
#include <iostream>
#include <cstdlib>

/************************************************************/
// Local includes

/************************************************************/
// Using declarations

using namespace std;

/************************************************************/
template <class T>
class Collection 
{
public:  

    Collection (int mArraySize)
    {
    m_size = mArraySize;
    array = new T[mArraySize];
    reset();
}
/************************************************************/ 

int 
size()
{
    return nextEmpty;
}

/************************************************************/ 

void
reset()
{
    nextEmpty = 0;
    nextToRead = 0;
}

/************************************************************/ 

void
insert(const T& a)
{
    if (nextEmpty < m_size)
    {
        array[nextEmpty++] = a;
    }
}

/************************************************************/ 

bool
isEmpty() 
{
   if(m_size == 0)
   {
       return true;
   }
   else
   {
       return false;
   }
}

/************************************************************/ 

void
makeEmpty() 
{  
    m_size = 0;
    array = NULL;
}

/************************************************************/

void
remove(const T& r) 
{
    int i = 0;
    for (i = 0; i < m_size; i++)
    {
        if (array[i] == r)
        {
            break;
        }
    }
    while (i++ < m_size)
    {
        array[i - 1] = array[i];
    }
    m_size--;
}

/************************************************************/


void
contains(T array, T target) 
{

    for(int i = 0; i < m_size; i++)
    {

    }
}

/************************************************************/

T& 
get()
{
    return array[nextToRead++];
}

/************************************************************/

private:

T* array;
int nextEmpty;
int nextToRead;
int m_size;
};

/************************************************************/

#include <iostream>
#include <iterator>

/****************************************************************************/
// Local includes
#include "header.h"

/****************************************************************************/
// Using declarations

using namespace std;

/****************************************************************************/
// Prototypes, typedefs, etc.

bool
isEmpty();

void
makeEmpty();

void
insert();

void
remove();

void
contains();

void
testerFcn();

/****************************************************************************/

int main(int argc, char* pArgs[]) 
{
    testerFcn();

    return EXIT_SUCCESS;
}

/************************************************************/

void
testerFcn()
{
    Collection <int> testArray(15);

    // insert test
    cout << "Enter numbers to add to array (enter negative number to finish): " << endl;

    for(;;)
    {
        int n;
        cin >> n;

        if (n < 0) {
            break;
        }
        testArray.insert(n);
    }

    // remove test
    cout << "Enter value to remove, (enter negative number to finish): " << endl;

    for(;;)
    {
        int n;
        cin >> n;

        if (n < 0) {
            break;
        }
        testArray.remove(n);
    }

    cout << "Is the array empty: 0 = false, 1 = true ==> " << testArray.isEmpty() << endl;

    // print what we have
    cout << "New Array: " << endl;
    for (int i = 0; i < testArray.size(); i++)
    {
        cout << i << ":" << testArray.get() << endl;
    }
}

1 Ответ

2 голосов
/ 11 февраля 2012

Я бы предложил сделать небольшие шаги, поскольку вы новичок в C ++. Большая часть вашего синтаксиса неверна, и я чувствую, что вам лучше бы иметь какой-нибудь минимальный класс, который на самом деле компилируется, прежде чем беспокоиться о копировании элементов и определении размеров массивов. Но так как у вас это далеко, вот несколько общих советов (очевидно, я не буду писать правильный код для вас, так как это домашняя работа):

  • Вы используете T взаимозаменяемо как ваш содержащийся тип и тип массива. На самом деле вызов new T[x] дает вам указатель на t, т.е. T*. Вы должны понимать разницу между ними, чтобы выучить C или C ++.

  • Ваша функция ensureCapacity принимает два аргумента. Вы не должны принимать переменную-член m_array в качестве аргумента - она ​​на самом деле не будет делать то, что вы ожидаете здесь (для бонусных баллов подумайте, что она будет делать ). Также подумайте, имеет ли смысл minimumCapacity быть также T.

  • Вы выделяете два новых массива в ensureCapacity и никогда delete ничего. Помните, что это C ++, и вы должны как-то освободить память. Кроме того, вам действительно нужен только один новый, больший массив - я думаю, что здесь может быть небольшая путаница вокруг разницы между T и T* в том, как вы можете поменять их местами.

  • Вы уверены в сравнении m_array[m_size] < minimumCapacity? Что вы здесь сравниваете и почему?

Надеюсь, это поможет. Опять же, я предлагаю вам попытаться разобраться с основными понятиями языка (которые, по общему признанию, более хитры, чем многие другие), прежде чем слишком сильно беспокоиться о логике изменения размера массива - возможно, начните с очень простого класса с массивом фиксированного размера и двигаясь вперед оттуда.

...