• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

jak użyć w ten sposób std::vector?

+2 głosów
820 wizyt
pytanie zadane 11 kwietnia 2021 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

mamy vector<int>wektor który ma n elementów. Chce do niego dopisać m elementów, a następnie usunąć pierwsze n elementów. Wymyśliłem taki niedziałający kod:


vector<int>wektor;
wektor.assign( { 1, 2, 3, 4 } );

auto iter = wektor.end();

wektor.push_back( 5 );
wektor.push_back( 6 );

wektor.erase( wektor.begin(), iter );

for( auto it = wektor.begin(); it != wektor.end(); it++ )
    cout << *it;

jak to poprawnie napisać żeby kod działał? W taki sposób jakby zawodowy programista wzorowo napisał?

3 odpowiedzi

0 głosów
odpowiedź 11 kwietnia 2021 przez Jakub 0 Pasjonat (23,120 p.)
wybrane 12 kwietnia 2021 przez Daaa22
 
Najlepsza

std::vector w C++ to nic innego jak zwyczajna nakładka na dynamiczną tablicę. Dynamiczna tablica, której wskaźnikiem dysponuje wektor, ma pewną zarezerwowaną wielkość.

Gdy dodajesz nowy element do wektora, a miejsca zabraknie - to przydzielany jest zupełnie nowy obszar pamięci, gdzie wszystkie dane wektora zostaną przekopiowane.

No więc masz wskaźnik na za-ostani element wektora:

auto iter = wektor.end();

kiedy dodajesz nowy item:

wektor.push_back( 5 );

miejsca brakuje... Dla wektora przydzielana jest nowa pamięć, a twój wskaźnik iter przestaje być poprawny.

"Rozwiązaniem" jest określenie na początku minimalnej pojemności wektora, w tym wypadku minimum 6:

wektor.reserve(6);

W praktyce nie powinno się używać wskaźnika na wektor sprzed jego (wektora) modyfikacji, bo nie masz gwarancji co do poprawności adresu na który on wskazuje.

+1 głos
odpowiedź 11 kwietnia 2021 przez j23 Mędrzec (195,220 p.)

Iterator wektora (iter) staje się nieważny, jeśli dodasz lub usuniesz jakiś element.

+1 głos
odpowiedź 12 kwietnia 2021 przez VBService Ekspert (256,600 p.)

Dokładnie jak napisał @Jakub 0

 

std::vector::erase

 

Propozycja zmian  smiley

online

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int>wektor;
    wektor.assign( { 1, 2, 3, 4 } );
    
    wektor.push_back( 5 );
    wektor.push_back( 6 );
    
    wektor.erase (wektor.begin(), wektor.begin()+4);
    
    for( auto it = wektor.begin(); it != wektor.end(); it++ )
        cout << *it << " ";
    
    return EXIT_SUCCESS;
}

 

Podobne pytania

0 głosów
1 odpowiedź 534 wizyt
pytanie zadane 19 marca 2019 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
0 głosów
1 odpowiedź 342 wizyt
pytanie zadane 19 października 2016 w C i C++ przez MasterKiller Nowicjusz (120 p.)
0 głosów
1 odpowiedź 431 wizyt

93,496 zapytań

142,431 odpowiedzi

322,788 komentarzy

62,931 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...