Итерация по вектору и удаление содержимого - PullRequest
0 голосов
/ 06 июня 2018

Это хорошая или стандартная практика для кодирования подобным образом, чтобы циклически проходить через вектор, удаляя при этом ненужные элементы без потери производительности.Если есть более быстрый способ, пожалуйста, предложите это.Этот вектор имеет вид std::vector<AnimationState*> activeAnimations;

void AnimationPack::removeDeadAnimations()
{
    int counter = 0;
    std::remove_if(activeAnimations.begin(), activeAnimations.end(), 
        [&](AnimationState*& animation) {
            if (animation->isActive())
            {
                counter++;
                return true;
            }
            else
                return false;
        });
    activeAnimations.erase(activeAnimations.end() - counter, activeAnimations.end());
}

Отредактированная версия

void AnimationPack::removeDeadAnimations()
{
    activeAnimations.erase(std::remove_if(activeAnimations.begin(), activeAnimations.end(), 
        [&](AnimationState*& animation) {
            if (animation->isActive())
                return true;
            else
                return false;
        }),activeAnimations.end());
}

Отредактированный код (как указано в комментариях)

void AnimationPack::removeDeadAnimations()
{
    activeAnimations.erase(std::remove_if(activeAnimations.begin(), activeAnimations.end(),
        [](AnimationState*& animation) { return animation->isActive(); }), activeAnimations.end());
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Да, это называется стирание-удаление идиома.

Цитата из Википедии:

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

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

Для этого в библиотеке алгоритмов предусмотрены алгоритмы remove и remove_if.

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

remove возвращает итератор, указывающий на первый из этих элементов, поэтому их можно удалить с помощью одного вызова erase.

0 голосов
/ 06 июня 2018

Удаляет и удаляет элемент из вектора, повторяя его.

 void AnimationPack::removeDeadAnimations()
    {
        activeAnimations.erase(std::remove_if(activeAnimations.begin(), activeAnimations.end(),
            [&](AnimationState*& animation) {
            if (animation->isActive())
                return false;
            else
            {
                delete animation;
                return true;
            }
        }), activeAnimations.end());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...