2015-12-04 5 views
-1

Я создаю функцию быстрой сортировки для класса, в котором я находится. Функции, связанные с этим, предназначены для сортировки массива с помощью указателей, но мне сложно определить, правильный синтаксис для управления массивом, который был динамически создан. Вот фрагмент кода:Манипулировать динамически называемый массив с помощью указателя

`/* 
* Dynamically allocates an array with the given capacity. 
* If a previous array had been allocated, delete the previous array. 
* Returns false if the given capacity is non-positive, true otherwise. 
* 
* @param 
*  size of array 
* @return 
*  true if the array was created, false otherwise 
*/ 
bool createArray(int capacity){ 
    if(capacity<0)return false; 
    if(arrayP!=NULL){ 
    if(!arrayP.empty()){ 
    delete arrayP; 
    arrayP= new int[capacity]; 
    } 
    } 
    arrayP= new int[capacity]; 
    return true; 
}` 

Любая информация или ресурсы о том, как вызывать функции на arrayP и перебирать массив будет очень полезным

+1

Что означает «вызов функций на массивP»? И как бы вы обычно перебирали массив в C++? – immibis

+0

Похоже, что 'createArray' должен быть членом класса, управляющего динамическим массивом. –

+0

Ваши характеристики возвращаемого значения различны. –

ответ

0

я должен предположить, у вас возникли проблемы с следующим , который не действует на int*:

if(!arrayP.empty()) ... 

правильный подход, принимая, что использование сырых указателей, как это на самом деле не является нормой в эти дни, как это:

arrayP = new int [capacity]; 

Это все вы делаете. Если вы хотите удалить старую (независимо от того, является ли он nullptr или нет), вы звоните:

delete [] arrayP; 

Помимо этого, вы индекс в него так же, как вы бы массив:

for(int i = 0; i < capacity; i++) 
{ 
    arrayP[i] = 0; 
} 

Примечание что выше, также может быть достигнуто с:

std::fill(arrayP, arrayP + capacity, 0); 

Кроме того, ваша функция должна действительно принять size_t и использовать Assert, чтобы убедиться, что он не равен нулю. Нет необходимости иметь возвращаемое значение. Если выделение не удастся, new [] выдаст исключение.

void createArray(size_t capacity) 
{ 
    assert(capacity > 0); 
    delete [] arrayP; 
    arrayP = new int [capacity]; 
    arrayCapacity = capacity;  // <-- You really should remember this. 
} 

Я хочу остановиться здесь, прежде чем это станет слишком много, как код-обзор, и я начинаю требовать, что вы используете std::vector или std::unique_ptr, и что семантика имени «создать массив» должен фактически утверждать, -fail, если он уже создан.

+0

Я ценю комментарии, я бы этого не делал, но класс, содержащий эту функцию, наследуется от файла интерфейса, который мне не разрешено изменять. Они становятся довольно придирчивыми к тому, как они этого хотят, потому что им нужно работать со своей системой тестирования/оценки. –

+0

Есть ли способ узнать, указывает ли массив arrayP на пустой? что-то вроде arrayP-> empty()? –

+0

Что вы подразумеваете под «пустым»? Это всего лишь блок памяти. Он содержит все, что было до выделения, или после того, как к нему были написаны конкретные значения. – paddy