Как удалить элементы из динамически размещенного массива? - PullRequest
1 голос
/ 12 февраля 2012

У меня есть динамически распределенный массив:

myRectangle lastRectanglesArray = new myRectangle[lastMaxLabel];

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

Я думал, что смогу пройтись по этому массиву и получить количество элементов, которые удовлетворяют моему условию, а затем выделить новый массив. Но как я могу «перенести» эти «нужные» элементы в мой новый массив?

Только для справки: я не могу использовать контейнеры STL.

Ответы [ 5 ]

1 голос
/ 12 февраля 2012

Ваш выглядит как идеальный случай для использования связанного списка.Однако вам придется покончить с частью new myRectangle[lastMaxLabel], поскольку вы должны реализовать ее как часть вашей функции Insert().

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

Если вы уделите больше внимания вашему варианту использования, мы сможем придумать лучшие альтернативы.

1 голос
/ 12 февраля 2012
myRectangle * lastRectanglesArray = new myRectangle[lastMaxLabel];
// initialize the entries in the lastRectanglesArray

// create a temporary array which contains info about each individual
// entry. namely, it only holds info about whether the entry should
// be kept, or deleted.
// we also use the 'entries' value, which is the number of entries
// in the new array
bool * entriesToKeep = new bool[lastMaxLabel];
int entries = 0;

// check each entry, and mark whether it should be kept or deleted
for (int i = 0; i != lastMaxLabel; ++i) {
    // check whether the entry should be kept or deleted...
    // here, i just put a function with signature like:
    // bool shouldKeepRectangle(const myRectangle &);
    entriesToKeep[i] = shouldKeepRectangle(lastRectanglesArray[i]);
    if (entriesToKeep[i]) ++entries;
}

// create a new array that will contain the entries that should be kept
myRectangle * rectanglesArray = new myRectangle[entries];

// assign the entries in the new array
for (int i = 0, j = 0; i != lastMaxLabel && j != entries; ++i) {
    if (entriesToKeep[i])
        rectanglesArray[j++] = lastRectanglesArray[i];
}

// free the memory held by the temp array
delete [] entriesToKeep;

// if the old array is not needed anymore, delete it
delete [] lastRectanglesArray;

// and here you have rectanglesArray, a brand new array that contains
// only the elements that you need.
1 голос
/ 12 февраля 2012

Просто переместите следующую ячейку массива поверх той, которую необходимо удалить, и переместите все до конца массива.

0 голосов
/ 12 февраля 2012

если у вас большой объем данных в массиве, что будет проблемой для сдвига с использованием цикла

, возможно, вам следует создать свой собственный класс управления массивом (find, add, deleteAt и т. Д.).

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

0 голосов
/ 12 февраля 2012

Я согласен с Michael Chinen - используйте вместо него std :: vector. Таким образом вы избежите многих других потенциальных проблем. Если вы действительно хотите использовать динамические массивы, посмотрите этот вопрос: Удалите элемент массива и сдвиньте остальные

...