Jak prawidłowo usunąć cały kontener typu vector?

0

Jak w temacie. Mam taki kod:

 vector <int> tablica;
    int totalitems=6;
    for (int i=0; i<totalitems; i++)
    {
        tablica.push_back(i);
    }


    for (int i=0; i<totalitems; i++)
    {
        cout << tablica[i] << endl;
    }
    cout << endl << endl;

    tablica.clear();

    for (int i=0; i<4; i++)
    {
        tablica.push_back(i+10);
    }

    for (int i=0; i<totalitems; i++)
    {
        cout << tablica[i] << endl;
    }

Który wyświetla:

0
1
2
3
4
5


10
11
12
13
4
5

Dlaczego na końcu wyświetla "4,5"? Czy te wartości nie powinny zostać usunięte za pomocą tablica.clear(); a przy próbie wyświetlenia - nie powinno pojawić się 0?

2

Na mój gust w tym kodzie polegasz na tzw undefined behaviour. W tym konkretnym przypadku prawdopodobnie vector.clear() nie czyści tablicy pod spodem tylko zmienia aktualną długość wektora na 0. Zresztą co rozumieć przez czyszczenie? Wstawianie zer? Jest gdzieś zdefiniowane, że 0 jest czyste w C++?

3

Zamień metodę dostępu do wektora z indeksowania przy pomocy [i] na funkcję at(i) to się przekonasz co takiego zrobiłeś.

3
int totalitems=6;
// ...
tablica.clear();

for (int i=0; i<4; i++)
{
    tablica.push_back(i+10);
}

for (int i=0; i<totalitems; i++)
{
    cout << tablica[i] << endl;
}

UB i tyle.

0

Konkretniej chcę zrobić wektor obiektów wczytywanych z plików - chcę, by podczas usunięcia jakiegoś obiektu z pliku (dokonanego z poziomu programu), doszło do ponownego utworzenia wektora obiektów - tym razem bez uwzględnienia tego usuniętego. W tym celu chciałbym najpierw wyczyścić ten wektor ze wszystkich obiektów, a następnie załadować ponownie z pliku.

0

No to po prostu iteruj po jego wartościach, a nie poza jego końcem.

0

https://stackoverflow.com/questions/1525535/delete-all-items-from-a-c-stdvector?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

http://en.cppreference.com/w/cpp/container/vector

twojVector.clear()

dodajesz 4 a iterujesz do 6

1

Nie odwołuj się bezpośrenio przez [ ]. Jesli potrzebujesz przeleciec przez całość wektora używasz
for(auto t : tablica)
Jeśli chcesz mieć większą kontrole używasz <iterator>.

0

Dziękuje bardzo za pomoc!

Mam jeszcze jedno pytanie - czy użycie metody nazwaWektora.free() w pełni usuwa będące w kontenerze obiekty jakiejś klasy, czy jednak coś zostaje i trzeba jeszcze coś zrobić?

0

Nie kojarzę takiej metody. Chodzi Ci o clear()? Jeśli tak - tak. Przy czym nie ma potrzeby jawnego jej użycia jeśli wektor jest niszczony, np. przy wyjściu z zakresu.

0

Tak tak chodziło o clear :D Dziękuję za pomoc ;)

0

albo std::vector<T>().swap(v); jeśli chcesz "całkowicie wyzerować" (łącznie z jego capacity).

1 użytkowników online, w tym zalogowanych: 0, gości: 1