Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

std::find

3 réponses
Avatar
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.

3 réponses

Avatar
Sylvain Togni
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
Avatar
pjb
Guillaume GOURDIN writes:

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__
Avatar
James Kanze
On Jul 11, 4:07 pm, Guillaume GOURDIN wrote:
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