Новый размер и размер массива - PullRequest
2 голосов
/ 04 декабря 2011

У меня есть динамически созданный массив целых чисел.Теперь мне нужно удалить все элементы с индексом% 3 == 0. (например, 3, 6, 9, ...).Итак, каков наилучший способ уменьшить размер массива?С malloc я могу использовать realloc для той же части памяти, но как насчет оператора new?Что делать таким образом.Просто сдвиньте все элементы влево, сделайте ноль для всех остальных элементов?

Ответы [ 4 ]

3 голосов
/ 04 декабря 2011

#include <algorithm>
#include <iostream>
#include <vector>

bool IsDividedByThree (int i) { return ((i%3)==0); }

int RandomNumber () { return (rand()%100); }

int main()
{
    std::vector<int> myInts(50);

    std::generate(myInts.begin(), myInts.end(), RandomNumber);

    std::copy(myInts.begin(), myInts.end(), std::ostream_iterator<int>(std::cout, " "));

    myInts.erase(std::remove_if(myInts.begin(), myInts.end(), IsDividedByThree), myInts.end());

    std::copy(myInts.begin(), myInts.end(), std::ostream_iterator<int>(std::cout, " "));

}

Разве не так приятно, что STL позаботится обо всем за вас?

Хм не видел комментарий,в котором один не использует STL.

Версия C:

    int *temp = new int[NEW_SIZE];
    memcpy( temp , old_array, size_of_old_array * sizeof(int) );
    delete[] old_array;
    old_array = temp;
  1. создает массив динамически
  2. создаетновый массив с новым размером
  3. скопировать элементы из первого во второй массив
  4. удалить первый массив
  5. перенаправить указатель на первый массив во второй

Все эти ответы Итак, как лучше всего уменьшить размер массива? - Я предполагал, что вы уже знаете, как решить остальную часть вашей проблемы.

2 голосов
/ 04 декабря 2011

Я бы просто выделил новый меньший массив, а затем скопировал бы в него элементы.Примерно так (включая элемент с индексом 0):

int* array = new int [original_size];

// fill array

size_t new_size = original_size - original_size / 3 - 1; // i think i got this right, untested
int* new_array = new int [new_size];

for (int i = 0, int j = 0; i < original_size; i++)
{
    if (i % 3 == 0)
    {
        new_array[j] = array[i];
        j++
    }
}

delete [] array;
array = new_array;
new_array = nullptr;

Конечно, вы можете работать на месте и сдвигать элементы влево.Но вы не можете удалить часть массива, которая была выделена с помощью new[].

Поскольку это упражнение, и вы не можете использовать STL, почему бы вам не попытаться реализовать простой векторный класссами?

0 голосов
/ 04 декабря 2011

Вы можете использовать размещение нового оператора в C ++. (#include <new> требуется). Например

#include <new>

int main(int argc, char **argv) {
    double *b = new double[10];
    new(b) double[8];

    delete [] b;
}
0 голосов
/ 04 декабря 2011

Просто установив элементы данных на 0, вы не освободите их. А когда вы выделяете новую память для массива с измененным размером, вам необходимо скопировать все элементы из предыдущей памяти.

Я бы предложил вам реализовать его в виде связанного списка.

...