2013-06-22 3 views
0

У меня есть массив целочисленных данных, называемых значениями, и мне нужно вставить в массив новую Integerdata. Я подумал о том, чтобы создать временный массив для копирования всего содержимого, а затем создать новый массив с оригиналом размера + 1, но я все равно получаю много ошибок. любая помощь?метод вставки для массива объектов C++

class IntegerData : public Data { 
public: 
int value; 

// This is the syntax for a constructor that initializes the 
// properties value to the parameters 
IntegerData(int value) : value(value) {} 

} 
class ArrayCollection : Collection { 
// length of values is always the same as count 
Data ** values; 
int count; 

public: 
ArrayCollection() { 
    // initialize the array to NULL 
    this->values = NULL; 
    this->count = 0; 
} 

~ArrayCollection() { 
    // must clean up the internally allocated array here 
    if (values != NULL) { 
    delete [] values; 
    } 
} 

/** 
* Returns the count of the number of elements in the Collection 
*/ 
int size() const { 
    return count; 
} 



    /** 
* Gets the Data value at the specified index. If index >= size() then 
* NULL is returned. 
*/ 
Data * get(int index) { 
    if (index >= size()) { 
    return NULL; 
    } 
    else { 
    return values[index]; 
    } 
} 



????-- I need help with this method-- 
// I try to dynamically allocate tempArray but I get the error message saying: cannot 
// allocate an object of abstract type 'Data' 
void insert(Data * other){ 
count++; 
Data **tempArray = new Data[count]; 

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

tempArray[i] = values[i]; 
} 

delete [] values; 



    values = tempArray; 

} 




} 






int main(int argc, const char * argv[]) { 
// create an ArrayCollection for our collection of integers 
ArrayCollection * collection = new ArrayCollection(); 

if (argc == 1) { 
// they didn't provide any arguments to the program, insert a 
// value of zero so that the main function still works 
collection->insert(new IntegerData(0)); 
} 
else { 
for (int i = 1; i < argc; i++) { 
    // read user input for integer value 
    int x = atoi(argv[i]); 

    // insert it to our collection 
    collection->insert(new IntegerData(x)); 
} 
} 

// print the collection 
cout << collection->toString() << endl; 

// check the implementation of member 
IntegerData * five = new IntegerData(5); 
cout << "five is a member of collection? " << collection->member(five) << endl; 

// now we are going to insert and remove a few items -- MARKER (a) 
IntegerData * v0 = (IntegerData *)collection->get(0); 
collection->remove(v0); 
cout << collection->toString() << endl; 

// check after removing the 0th element -- MARKER (b) 
cout << "five is a member of collection? " << collection->member(five) << endl; 

collection->insert(v0); 
cout << collection->toString() << endl; 

// check after inserting the 0th element back 
cout << "five is a member of collection? " << collection->member(five) << endl; 

// clean up memory 
delete five; 

// must delete IntegerData instances that we allocated in main 
// because they are not deleted by the data structure 
for (int i = 0; i < collection->size(); i++) { 
delete collection->get(i); 
} 
// now delete the data structure -- MARKER (c) 
delete collection; 
} 
+0

Где инициализируются значения? Если это уже по крайней мере количество пикселей ++, вы собираетесь выйти из диапазона в своем массиве при попытке вставить. – AndyG

+0

Почему бы вам не сделать свой новый размер массива 1 больше, и ваша функция вставки займет 2 аргумента. 2 аргументами будут данные для вставки, а индекс - вставить. Затем внутри функции проведите цикл и скопируйте каждое значение, и как только вы достигнете копии индекса в переданном значении. – krb686

+0

Мы здесь не для того, чтобы делать домашнее задание. Какие ошибки вы получаете? – Adrian

ответ

2

Поскольку вы используете C++ Я хотел бы предложить использовать вектор вместо:

std::vector<Data *> vect; 
... 
void insert(Data * other){ 
    vect.push_back(other); 
} 

В противном случае в C, функция может вести себя так:

(при условии, что способ выделен values массив в первую очередь не допускает динамического изменения размера ...)

  • Создать новый te mporary массив values_tmp размера (графа ++)
  • Затем используйте memcpy скопировать предыдущие данные в новый массив
  • магазин значение: values_tmp[count] = other; в конце.
  • Свободная память для values
  • Erase values с новым массивом: values = values_tmp;
+0

Мы должны использовать весь код с нуля, и так как я впервые использовал C++, t наученные векторы, тем не менее, мне не разрешено использовать их. – user2510809

+0

Добавлен вывод для C: вы должны использовать временный массив с размером 'count + 1' ... Предполагая, что способ, которым вы выделили массив' values', в первую очередь, не позволяет динамически изменять размер ... –

0

инициализации вашего значения массива не видно из примера кода вы предоставили, однако, я постараюсь дать вам некоторые совет:

Если есть использовать массив здесь (и не СТЛ контейнеров), то вы, вероятно, следует инициализировать его в какой-то среднего размера значение, скажем 128. Отслеживайте этого числа, но и следить из количество элементов в нем (int т).

Когда ваш массив будет заполнен, вам придется изменить размер. Создайте новый массив размером 256 (что вдвое больше размера оригинала), скопируйте элементы из старого массива и удалите старый массив.

Таким образом, вы изменяете размер по логарифмической ставке, поэтому время вставки может быть амортизировано.

(да, это взято от того, что СТЛ вектор делает ... если мы не можем использовать его, почему бы не подражать?)

+0

Это отличная идея, но основным направлением этого проекта является управление памятью. Она хочет, чтобы я динамически выделял массив в новый размер каждый раз, когда я хочу вставить новую IntegerData, и это я не знаю, как это сделать. – user2510809

+0

@ user2510809 Хорошо, вы знакомы с «новым» оператором? Это то, что используется для динамического выделения вашей памяти. – AndyG

+0

Да, но когда я использую его в методе вставки, он не компилируется. Я имею опыт работы с Java, но это мой первый опыт использования C++ – user2510809

0

Это, безусловно, не может быть наиболее эффективным способом, но вы можете просто создайте новый массив с новым увеличенным размером, пропустите и скопируйте каждый элемент по 1 на 1, пока не достигнете индекса вставки, затем скопируйте вставленный элемент, затем продолжите копирование остальной части и верните новый массив.

IntegerData* insert(Data *other, int index) 
{ 
    IntegerData *newArray = new IntegerData[count +1]; 
    int offset = 0; 
    for(int i=0;i<count+1;i++) 
    { 
    if (i == index) 
    { 
     newArray[i] = other; 
     offset = 1; 
    } 
    else 
    { 
     newArray[i] = oldArray[i-offset]; 
    } 
    } 
    return newArray; 
}