Usuwanie elementów z std::vector<>

0

Witam. Mam zbiór obiektów _natures oraz dwa wektory natures, gameObjects na których znajdują się te obiekty. Chciałbym usuąć wszystkie obiekty _natures z wektorów natures oraz gameObjects. Mam już kod ale jest powolny. Da się to przyśpieszyć ?

void removeGameObjectsFromMainLists() {
    // delete _natures from natures and gameObjects
    for (auto& nature : _natures) {
        auto it = std::find(natures.begin(), natures.end(), nature);  // znajdz indeks
        if (it != natures.end())
            natures.erase(it); // usun z indeksu

        auto go = std::find(gameObjects.begin(), gameObjects.end(), nature); // znajdz indeks
        if (go != gameObjects.end())
            gameObjects.erase(go); // usun z indeksu
    }
}
0

Rozwiązanie:

for (auto& nature : _natures) {
    nature->exist = false;
}

for (int i = natures.size()-1; i >=0 ; i--)
    if (natures[i]->exist == false)
        natures.erase(natures.begin() + i);

for (int i = gameObjects.size() - 1; i >= 0; i--)
    if (gameObjects[i]->exist == false)
        gameObjects.erase(gameObjects.begin() + i);

6

https://en.cppreference.com/w/cpp/container/vector/erase2
Coś masz poplątane z organizacją danych.
Brakuje kontekstu, żeby to dobrze poprawić.

Ta twoja poprawka powyżej byłoby lepiej, jakby wyglądała tak:

for (auto& nature : _natures) {
    nature->exist = false;
}

std::erease_if(natures, [](const auto& nature) { return !nature->exists; });
std::erease_if(gameObjects, [](const auto& nature) { return !nature->exists; });

To ma złożoność O(n) twoje rozwiązanie nadal jest O(n^2)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.