Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Usuwanie danych wskaźników z wektora

Ostatnio zmodyfikowano 2016-11-24 15:12
Autor Wiadomość
krainamodu
Temat założony przez niniejszego użytkownika
Usuwanie danych wskaźników z wektora
» 2016-11-24 14:46:49
Witam, mam stworzony wektor przechowujący kilka wskaźników na obiekty i nie wiem jak usunąć element z wektora o podanych wartościach.

Tutaj jest uproszczony przykład programu:

C/C++
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
struct complex
{
    int im;
    int re;
};
complex * fill( int im, int re )
{
    complex * a = new complex();
    a->im = im;
    a->re = re;
    return a;
}
int main()
{
    vector < complex *> vec;
   
    vec.push_back( fill( 1, 5 ) );
    vec.push_back( fill( 26, 4 ) );
    vec.push_back( fill( 26, 4 ) );
    vec.push_back( fill( 15, 75 ) );
   
    complex * a = new complex();
    a = fill( 26, 4 );
   
    //vec.erase(vec.begin() + 1, vec.end() - 1); Dobra opcja gdy znam pozycje obiektów do usunięcia
    vec.erase( remove( vec.begin(), vec.end(), a ), vec.end() ); // nie działa
   
    for( auto it: vec )
    {
        cout << "Im: " << it->im << " Re: " << it->re << endl;
    }
    vec.clear();
   
   
   
    cin.get();
}
P-154078
j23
» 2016-11-24 15:08:31
Nie działa, bo remove porównuje wskaźniki, a nie wartości. Użyj remove_if ze zdefiniowanym odpowiednio predykatem.
P-154081
Monika90
» 2016-11-24 15:12:12
Dlaczego jest to wektor wskaźników? To tylko zmniejsza wydajność, nic nie dając w zamian.

A jeśli już musisz mieć wektor wskaźników, to powinien być wektor inteligentnych wskaźników, np: std::vector<std::unique_ptr<complex>>, uniknął byś wtedy wycieku pamięci takiego jak tu:
C/C++
complex * a = new complex();
a = fill( 26, 4 );

Ale w tym przypadku nie powinien to być wektor wskaźników, co rozwiąże również ten problem
C/C++
vec.erase( remove( vec.begin(), vec.end(), a ), vec.end() ); // nie działa
P-154082
« 1 »
  Strona 1 z 1