std::find

Le
Guillaume GOURDIN
Bonjour à tous,

je suis un peu récalcitrant à utiliser std::find si on condidére le code
suivant :

std::list<int> l1, l2;
find ( l1.begin(), l2.end(), 0 );

Je préférerai avoir une fonction 'find' sur les std::list, ce qui
emppêcherait les incohérences du code ci-dessous, où les 2 itérateurs
n'appartiennent pas à la même liste.

Quelle est la façon correcte et sûre de trouver un élément dans uns liste?

Merci pour votre aide.

G.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Sylvain Togni
Le #15348841
Guillaume GOURDIN a écrit :

je suis un peu récalcitrant à utiliser std::find si on condidére le code
suivant :

std::list<int> l1, l2;
find ( l1.begin(), l2.end(), 0 );

Je préférerai avoir une fonction 'find' sur les std::list, ce qui
emppêcherait les incohérences du code ci-dessous, où les 2 itérateurs
n'appartiennent pas à la même liste.

Quelle est la façon correcte et sûre de trouver un élément dans uns liste?



La Standard Library et particulièrement les algorithmes ont été conçus
avec un soucis d'efficacité et de généricité, ce qui n'est pas toujours
conciliable avec la sécurité, effectivement.

Mais rien ne t'empêche de définir un wrapper plus sécure (mais moins
générique du coup) :

template<class Container>
typename Container::iterator
find(Container& c, typename Container::value_type x)
{
return std::find(c.begin(), c.end(), x);
}

--
Sylvain Togni
pjb
Le #15348831
Guillaume GOURDIN
Bonjour à tous,

je suis un peu récalcitrant à utiliser std::find si on condidére le
code suivant :

std::list<int> l1, l2;
find ( l1.begin(), l2.end(), 0 );

Je préférerai avoir une fonction 'find' sur les std::list, ce qui
emppêcherait les incohérences du code ci-dessous, où les 2 itérateurs
n'appartiennent pas à la même liste.

Quelle est la façon correcte et sûre de trouver un élément dans uns liste?

Merci pour votre aide.



Bien sur, c'est:

namespace safe_and_correct{
template <class Container,class Element>
Container::iterator find(Container& container,Element& element){
return(std::find(container.begin(),container.end(),element));
}
}

std::list<int> l1, l2;
std::list<int>::iterator found=safe_and_correct::find(l1,0);

--
__Pascal Bourguignon__
James Kanze
Le #15355061
On Jul 11, 4:07 pm, Guillaume GOURDIN
je suis un peu récalcitrant à utiliser std::find si on
condidére le code suivant :



std::list<int> l1, l2;
find ( l1.begin(), l2.end(), 0 );



Je préférerai avoir une fonction 'find' sur les std::list, ce
qui emppêcherait les incohérences du code ci-dessous, où les 2
itérateurs n'appartiennent pas à la même liste.



Quelle est la façon correcte et sûre de trouver un élément
dans uns liste?



Correcte et sûre (surtout sûre) ne sont pas compatible avec la
bibliothèque standard. Avec une erreur comme ci-dessus, une
bonne implémentation ferait un core dump, mais ce n'est pas
garanti (et ça ne m'étonnerait pas que certaines implémentations
font une boucle sans fin).

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Publicité
Poster une réponse
Anonyme