Удаление вектора из 2D вектора

У меня есть 2D вектор, содержащий 96 блоков 600 значений, что я и хочу.

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

По вашему мнению, было бы лучше создать временный двухмерный вектор, который оттолкнет блоки, которые содержат достаточно энергии, а затем удалит исходный вектор из памяти или …

Должен ли я удалить блоки из вектора в этой конкретной позиции?

0

Решение

Я предполагаю, что у вас есть это:

typedef std::vector<value> Block;
typedef std::vector< Block > my2dVector;

и у вас есть такая функция:

bool BlockHasInsufficientEnergy( Block const& vec );

и вы хотите удалить блоки, которые не имеют достаточной энергии.

Под удалением вы подразумеваете, что хотите, чтобы после этого было меньше 96 блоков? Я приду так.

Тогда правильный способ сделать это:

void RemoveLowEnergyBlocks( my2dVector& vec )
{
my2dVector::iterator erase_after = std::remove_if( vec.begin(), vec.end(), BlockHasInsufficientEnergy );
vec.erase( erase_after, vec.end() );
}

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

remove_if находит все, что передает 3-е условие аргумента, и фильтрует его вне диапазона. Возвращает точку, где «мусор» в конце vector жизни. Затем мы стираем мусор. Это называется идиома удаления-стирания.

2

Другие решения

Может быть, вы захотите использовать связанный список, или просто установить отфильтрованные элементы как NULL, или пометить их флагом члена bool, или сохранить отдельный вектор индексов отфильтрованных элементов (если у вас есть несколько фильтров одновременно, это экономит память) ,

Решение зависит от того, каковы ограничения. Вам нужен произвольный доступ? Сколько занимает копирование объекта? И т.п.

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

0

Отчасти это зависит от того, как вы определитесь лучше в этом случае. У каждого метода могут быть свои преимущества, но трудно точно знать, что они из себя представляют. Скорее всего, с точки зрения памяти и производительности, скорее всего, несколько «лучше» стереть из вектора точные позиции, которые вам не нужны, вместо того, чтобы выделять совершенно новую.
Возможно, все же лучше рассмотреть возможность использования для этой цели deque или list, поскольку они могут избежать больших перераспределений, которые, вероятно, будет делать вектор, когда он пытается сохранить непрерывный сегмент памяти.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector