• 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?

Object Storage Arubacloud
+2 głosów
546 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 (194,920 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 (254,490 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ź 429 wizyt
pytanie zadane 19 marca 2019 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
0 głosów
1 odpowiedź 288 wizyt
pytanie zadane 19 października 2016 w C i C++ przez MasterKiller Nowicjusz (120 p.)
0 głosów
1 odpowiedź 230 wizyt

92,655 zapytań

141,545 odpowiedzi

319,979 komentarzy

62,024 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...