2015-01-27 5 views
1

Это для проблемы с неградиентной проблемой, где я ищу, чтобы найти как можно больше простых чисел. Одним из ограничений является то, что я должен использовать new/delete, поэтому std::vector не является вариантом. В этой проблеме мне нужно добавить в массив (в моем случае динамически созданный массив с именем list), который содержит простые числа. Моя цель - добиться аналогичной функциональности для вектора, где требуется выделить новую память, если в текущем массиве недостаточно места, а когда текущий массив заполняет новый массив, в 2 раза превышающий длину. Моя функция добавить штрих к списку нижесделать динамический массив более крупным

void PrimeList::addPrimeToList(int newPrime) { 
    if(sizeof(list)/sizeof(int) > total) { // there is still room in the array 
     list[total++] = newPrime; 
    } else { // list has run out of space to put values into 
     int *newList = new int [total*2]; // new list to hold all previous primes and new prime 
     for(int i=0; i < total; i++) { // for every old prime 
      newList[i] = list[i]; // add that old prime to the new list 
     } 
     newList[total++] = newPrime; // set largest and the last index of the new list to the new prime 
     delete [] list; // get rid of the old list 
     list = newList; // point the private data member list to the newly created list. 
    } 
} 

Примечания: всего является частным членом данных, который содержит количество простых чисел, найденное до этого момента.

Моя проблема заключается в том, что инструкция else (и временное распределение/освобождение) происходит каждый раз, когда вызывается функция (за исключением того, что первые два вызова всегда запускают первую часть if). Я бы подумал, что часть if будет работать в большинстве случаев - всякий раз, когда в списке все еще есть место, - так почему же это не так?

ответ

1

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

sizeof(list)/sizeof(int) 

является константным выражением. Его значение не зависит от выделенного массива, на который указывает указатель list.

Вы должны хранить размер выделенного отдельно, чтобы сделать этот код работать:

if(allocatedSize > total) { // there is still room in the array 
    list[total++] = newPrime; 
} else { // list has run out of space to put values into 
    int *newList = new int [total*2]; // new list to hold all previous primes and new prime 
    allocatedSize *= 2; 
    for(int i=0; i < total; i++) { // for every old prime 
     newList[i] = list[i]; // add that old prime to the new list 
    } 
    newList[total++] = newPrime; // set largest and the last index of the new list to the new prime 
    delete [] list; // get rid of the old list 
    list = newList; // point the private data member list to the newly created list. 
} 
Смежные вопросы