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?! ;-)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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...
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
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...
On Wed, 21 Jan 2004 19:47:39 +0100, "Patrick Mézard"
<patrick.mezard@ifrance.com> 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...
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...