OVH Cloud OVH Cloud

std::list et erase

3 réponses
Avatar
Plotark
Bonjour,

Est ce que l'on a le droit de faire un erase sur le end() d'une list?
Je m'explique. Sous VC++ 7.1 le code suivant marche tres bien:

#include <list>
#include <algorithm>
using namespace std;

int main()
{
list<int> l;
l.push_back(3);
l.push_back(4);

list<int>::iterator i = find(l.begin(),l.end(),5);
l.erase(i);

return 0;
}

alors que je vais un erase sur l.end() a priori (enfin de ce que je
comprends de find). Est ce un comportement standard ou est ce que ce
comportement est laisse libre a l'implementation (i.e. j'aurais un gros
crash genre null pointer si je passe sous gcc ou si j'utilise stl port). Je
n'ai pas reussi a trouver de document officiel sur internet pour me preciser
ca (suis je un neuneu du net?! ;-)

Merci par avance;

plotark

3 réponses

Avatar
Patrick Mézard
Est ce que l'on a le droit de faire un erase sur le end() d'une list?
Je m'explique. Sous VC++ 7.1 le code suivant marche tres bien:

#include <list>
#include <algorithm>
using namespace std;

int main()
{
list<int> l;
l.push_back(3);
l.push_back(4);

list<int>::iterator i = find(l.begin(),l.end(),5);
l.erase(i);

return 0;
}

alors que je vais un erase sur l.end() a priori (enfin de ce que je
comprends de find). Est ce un comportement standard ou est ce que ce
comportement est laisse libre a l'implementation (i.e. j'aurais un gros
crash genre null pointer si je passe sous gcc ou si j'utilise stl port).
Je

n'ai pas reussi a trouver de document officiel sur internet pour me
preciser

ca (suis je un neuneu du net?! ;-)


D'après la référence de la STL fournie par SGI
(http://www.sgi.com/tech/stl/Sequence.html), il est dit que erase(p) est
valide si p est un itérateur déréférençable. Ce qui n'est pas le cas de
end(). Rien n'est précisé dans la doc microsoft accompagnant VC 7.1. Alors
si quelqu'un a le standard sous la main...

Patrick Mézard

Avatar
Fabien LE LEZ
On Wed, 21 Jan 2004 19:47:39 +0100, "Patrick Mézard"
wrote:

D'après la référence de la STL fournie par SGI
(http://www.sgi.com/tech/stl/Sequence.html), il est dit que erase(p) est
valide si p est un itérateur déréférençable.


A priori, ça paraît logique. De plus, si une implémentation aussi
"classique" que celle de SGI n'autorise pas cette possibilité, il y a
peu de chances pour que la norme l'accepte.
De toutes façons, il me paraît dangereux de prendre l'habitude
d'utiliser directement la valeur de retour de std::find sans
vérification...

--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Avatar
Plotark
De toutes façons, il me paraît dangereux de prendre l'habitude
d'utiliser directement la valeur de retour de std::find sans
vérification...


Pas evident. En fait je me posais la question par analogie avec delete sur
un pointeur NULL.
Merci pour les reponses.

Plotark