C++ : suppression d'un objet dans un vector

Fermé
cssiste Messages postés 1 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 19 juillet 2007 - 19 juil. 2007 à 13:12
mamiemando Messages postés 33623 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2025 - 19 juil. 2007 à 17:48
Bonjour à tous,
en faite, j'ai un problème concernant les vecteurs de pointeurs,
Dans une méthode "Get_Objects_Coverd_P"
Je fais un parcours sur un vecteur de pointeurs "table" qui sont des objets possedant un nom ,un min et un max. Parmi les objets stockés, je voulais récupérer les objets qui sont inclus dans un objet P bien défini (c'est à dire ,la borne inf d'un objet est >= à lla borne inf de P et la borne sup d'un objet est <= par rapport à P)
les objets retenus sont stockés dans un nouveau vecteur de pointeurs qui s'appelle "Template_Object_Covered_P". et doivent être suuprimés du vecteur "table".
j'ai utilisé erase pour les effacer mais ça fonctionne pas.les objets ne s'effacent pas.
par contre quand j'applique ça dans main sans passer par une méthode ça marche.
A votre avis ,est ce que c'est à cause que je travaille sur des pointeurs???
Aidez moi
ci dessous le code :


/*************************************Objets Couverts par P**************************************************************/
vector<Object*> Get_Objects_Coverd_P(vector<Object*>table){
vector<Object*>Template_Object_Covered_P;
Object* OD;
Object* P;
int ind_p;

/***********************************Recherche de l'objet dominant*********************************************************/
OD = table.front();
cout <<"L'objet dominant est : "<<OD ->Get_Name()<<endl;

/***************************************Recherche d'un objet en intersection partielle avec l'objet dominant**************/
P = Get_P(table); // P est déjà calculé

/*************************Recherche des objets couverts par l'objet P ****************************************************/
if(P!=NULL){
/**************************On cherche dans la liste initiale**************************************************************/
Template_Object_Covered_P.clear();
for(ind_p=1;ind_p<table.size();ind_p++){
if((table[ind_p]->Get_Min()>=P->Get_Min()) && (table[ind_p]->Get_Max()<=P->Get_Max())){
Template_Object_Covered_P.push_back(table[ind_p]);
table.erase(table.begin()+ind_p); // Le problème est ici
ind_p--;
}
}
return Template_Object_Covered_P;
}
}




/******************************************************MAIN********************************************************/
int main()
{
char fileName [LGMAX_FILE_NAME + 1] ;
string name;
int min, max;
bool istemplate;
int nb_objects=0;
int i;
string Z_String ;
vector<Object*> table_objects;
vector<Object*> objects_covered_P;


/**************Lecture des informations dans le fichier qui contient les noms des objets leurs Xmin et leurs Xmax************/
cout << "name of the file : " ;
cin >> setw (LGMAX_FILE_NAME) >> fileName ;
ifstream entree (fileName, ios::in|ios::binary) ; // ou ios::in
if (!entree) { cout << "Error: can not open the file " << fileName <<endl ;
exit (-1) ;
}

while(!entree.eof())
{
entree >> name;
entree >> min;
entree >> max;
if(name == "*") break;
else
cout << "name: " << name << " min: " << min << " max: " << max << endl ;
table_objects.push_back(new Object(name,min,max,false));
nb_objects++;
}

entree.close () ;
cout << "**************************************************************\n";
cout << " Voici les noms, les min, les max des objets de votre image \n";
cout << "**************************************************************\n";
cout << "Nb objects: " << nb_objects << endl;


for(i= 0; i< nb_objects;i++){
cout<<table_objects[i]->Get_Name()<<"\t"<<table_objects[i]->Get_Min()<<"\t"<<table_objects[i]->Get_Max()<<"\n";
}
cout << "Taille du vecteur d'objets: " << table_objects.size()<<"\n";

objects_covered_P = Get_Objects_Coverd_P(table_objects);
cout<<"les objets couverts par P sont :"<<endl;
for(int y=0;y<objects_covered_P.size();y++)
cout<<objects_covered_P[y]->Get_Name()<<"\t";
cout<<endl;


/*for(int z=0;z<table_objects.size();z++){
table_objects.erase(table_objects.begin()+z);
z--;
}
cout<<endl;*/

cout<<"Table Objects contient :"<<endl;
for(int k=0;k<table_objects.size();k++)
cout<<table_objects[k]->Get_Name()<<"\t";
cout<<endl;
}

1 réponse

mamiemando Messages postés 33623 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2025 7 840
19 juil. 2007 à 17:48
Je regarderai en détail ce que tu as fait plus tard mais d'ores et déjà faire des suppression dans un std::vector est d'un point de vue pas très efficace car il force à décaler (et recopier) toute la fin du vector. Il serait peut être plus logique d'utiliser un autre container. La question c'est
- est-ce que l'indexation dans ton vector as une importance
- avec quelle complexité (O(log(n)), O(log(n)) veux-tu pouvoir retrouver un élément
- est ce que tu peux avoir plusieurs structures identiques dans ton container

D'un point de vue STL quand tu fais un erase, les iterators que tu utilises pour parcourir ton container sont dès lors invalides (typiquement l'iterator obtenu par la méthode .end()). De plus tu ne peux pas ajouter un entier à un iterator, car un iterator n'est pas un pointeur, même si ça y ressemble.

Bonne chance
0