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

question-closed Usuwanie dynamicznych obiektów z wektora

Object Storage Arubacloud
0 głosów
1,975 wizyt
pytanie zadane 19 kwietnia 2015 w C i C++ przez criss Mędrzec (172,590 p.)
zamknięte 17 listopada 2016 przez criss

Zastanawiam się jak odbywa się usuwanie elementów wektora. U mnie to wygląda tak:

vector<Obiekt> v;
Obiekt *w;
// tutaj dodanie czegos do wektora
w = new Obiekt();
v.push_back(*w);
//tutaj wyrzucenie z wektora
w= &v[choice];
delete w;
v.erase(v.begin()+choice);

w - wskaźnik

v- wektor

Dla próby zrobiłem w klasie zmienną statyczną ilosc, konstruktor ilosc++, destruktor ilsoc--

Przy usuwaniu zmienna ilosc zaczyna wariować, nawet nie że zmniejsza się np o 2 za każdym razem, po prostu odejmowane są randomowe liczby. W samym działaniu programu to niby nie przeszkadza, ale zależy mi zeby pamięć była czysta i faktycznie usuwany obiekt nie tylko wyleciał z wektora, ale też zniknął z pamięci.

komentarz zamknięcia: .

2 odpowiedzi

+1 głos
odpowiedź 19 kwietnia 2015 przez daan Pasjonat (17,640 p.)
A nie myślałeś może o stworzeniu vectora wskaźników ? :P vector<Obiekt*> wtedy wrzucasz v.push_back(new Obiekt), a usuwasz np. delete *it; gdzie it to jest iterator do tego vectora tylko musisz pamietać że trzeba każdy element wektora ręcznie usuwać zanim użyje się pop_back albo clear albo erase :D
komentarz 19 kwietnia 2015 przez criss Mędrzec (172,590 p.)
delete v[cyferka] by nie działało? Z tym *it nei bardzo rozumiem. Co do samego pomysłu jest na tyle podobny w działaniu co teraz mam, że chyba nie ma sensu, przynajmniej tak mi się wydaje. W każdym razie chce się dowiedzieć jak przebiega erase(), że tak mi ta ilosc wariuje.
komentarz 19 kwietnia 2015 przez daan Pasjonat (17,640 p.)
poczytaj o iteratorach bo w vectorze możesz użyć [] ale np. w takiej liście albo mapie już nie da rady :) jeżeli chcesz tworzyć obiekty dynamicznie to dlaczego nie chcesz przechowywać wskaźników na nie ? tylko chcesz przechowywać statyczne obiekty ? sprawdź metode emplace która potrafi sama stworzyć obiekt i go dodać do vectora :P
komentarz 20 kwietnia 2015 przez criss Mędrzec (172,590 p.)

Okej, zacząłem ogarniać. Dla próby zeby zobaczyć jak to działa napisałem coś takiego:

class Obiekt{
      public:
      string name;
      void show()
      {
           cout<<this->name<<endl;
           }
      Obiekt(){ name="nazwa"; }
      };
      

int main()
{
vector<Obiekt*> v;
v.push_back(new Obiekt());

while(true){
for( vector<Obiekt*>::iterator it = v.begin(); it != v.end(); it++ )
{
    (*it)->show();
}
char choice=getch();
if(choice=='q') v.push_back(new Obiekt());
}

Problem w tym, że po każdym kliknięciu 'q', wyświetlają się kolene 2 "nazwy". Co zrobiłem źle?

//EDIT: nieważne, zapomniałem czyścić ekran : D

0 głosów
odpowiedź 20 kwietnia 2015 przez criss Mędrzec (172,590 p.)

class Obiekt{
      public:
      string name;
      void show()
      {
           cout<<this->name<<endl;
           }
      Obiekt(){ name="nazwa"; }
      };
      

int main()
{
vector<Obiekt*> v;
v.push_back(new Obiekt());
int poz=0;

while(true){
for( vector<Obiekt*>::iterator it = v.begin(); it != v.end(); it++ )
{
    cout<<(*it)->name;
//tutaj:
    if(it=v.begin()+poz) cout<<"<-"<<endl;
    else cout<<endl;
}
char choice=getch();
if(choice=='q') v.push_back(new Obiekt());
system("cls");
}
}

Chce zeby pojawiała mi sie taka strzałka w zalezności od zmiennej poz. Chciałem to zrobić w taki sposób jak widać. Wyrzuca mi taki error: 

could not convert `((*&it) <unknown operator> ((const __gnu_cxx::__normal_iterator<Obiekt**, std::vector<Obiekt*, std::allocator<Obiekt*> > >&)((const __gnu_cxx::__normal_iterator<Obiekt**, std::vector<Obiekt*, std::allocator<Obiekt*> > >*)(&(&(&v)->std::vector<_Tp, _Alloc>::begin [with _Tp = Obiekt*, _Alloc = std::allocator<Obiekt*>]())->__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator+ [with _Iterator = Obiekt**, _Container = std::vector<Obiekt*, std::allocator<Obiekt*> >](((const ptrdiff_t&)((const ptrdiff_t*)(&poz))))))))' to `bool' 

Dosc ładny, nie powiem :| Domyslam sie dlaczego tak nie moge zrobic, ale w takim razie jak inaczej?

Podobne pytania

0 głosów
1 odpowiedź 754 wizyt
pytanie zadane 24 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
0 odpowiedzi 641 wizyt
pytanie zadane 18 sierpnia 2021 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
0 odpowiedzi 560 wizyt
pytanie zadane 26 lipca 2021 w C i C++ przez hicodyn Początkujący (420 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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!

...