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

std::find avec plusieurs arguments

3 réponses
Avatar
Michaël Delva
Bonjour à tous,

j'ai la structure suivante:

struct Index_Joueur
{
AnsiString nom_equipe,
nom_joueur;
int index_du_joueur;
}

et le vecteur suivant:

std::vector<Index_Joueur> liste_index_joueurs;

Je veux pouvoir chercher le nom d'un joueur grâce au nom de l'équipe et à
son index.

J'ai donc défini mon operator == comme ceci:

bool operator==(const AnsiString & nom_of_equipe, const int
index_of_joueur) const
{
return (nom_equipe == nom_of_equipe && index_du_joueur == index_of_joueur);
}

Mais comment je dois écrire std::find??

std::vector<Index_Joueur>::const_iterator = std::find
(liste_index_joueurs.begin(),liste_index_joueurs.end(),??????????);

Merci d'avance!!

3 réponses

Avatar
Gourgouilloult

j'ai la structure suivante:

struct Index_Joueur
{
AnsiString nom_equipe,
nom_joueur;
int index_du_joueur;
}

et le vecteur suivant:

std::vector<Index_Joueur> liste_index_joueurs;

Je veux pouvoir chercher le nom d'un joueur grâce au nom de l'équipe et à
son index.

J'ai donc défini mon operator == comme ceci:

bool operator==(const AnsiString & nom_of_equipe, const int
index_of_joueur) const
{
return (nom_equipe == nom_of_equipe && index_du_joueur == index_of_joueur);
}


«Euh... là, je voudrais pas m'avancer, mais j'ai comme un doute.» ;)
Deux possibilités. Soit c'est un membre de Index_Joueur, et ça ne
compile pas, car l'op==() ne peut pas être ternaire. Soit c'est une
«fonction libre» et ça ne compile pas car nom_equipe et index_du_joueur
ne sont pas définis dans la portée, et auquel cas tu donnes l'air de
vouloir comparer une AnsiString avec un int...
Non, tu n'aurais quand même pas fait le coup des vars globales (ou qui y
ressembleraient) de même id que tes champs d'Index_Joueurs ?

bool operator == (Index_Joueur const & j1, Index_Joueur const & j2)
{
return j1.nom_equipe == j2.nom_equipe &&
j1.index_du_joueur == j2.index_du_joueur ;
}

devrait être un bon candidat.

Mais comment je dois écrire std::find??

std::vector<Index_Joueur>::const_iterator = std::find
(liste_index_joueurs.begin(),liste_index_joueurs.end(),??????????);


En supposant que tu aies quelque chose du goût de

Index_Joueur::Index_Joueur (AnsiString const & n_eq, AnsiString const &
n_j, int const idx) : nom_equipe (n_eq), nom_joueur (n_j),
index_du_joueur (idx) { /*...*/ }

(pff, trop affreux d'être limité à moins de 80 car de large... je laisse
tomber ;)

Suffit alors d'avoir le nom de l'équipe et l'indice du joueur recherché :

std::vector <Index_Joueur>::const_iterator
trouve_joueur ( std::vector <Index_Joueur> const & liste_index_joueurs,
AnsiString const & nom_equipe, int const idx_joueur )
{
return std::find ( liste_index_joueurs.begin (),
liste_index_joueurs.end (),
Index_Joueur (nom_equipe, "", idx_joueur) ) ;
}

Gourgou

Avatar
Gourgouilloult
bool operator==(const AnsiString & nom_of_equipe, const int
index_of_joueur) const { /*...*/ }


Deux possibilités. [...]


Arf, j'avais pas vu le const ;)

Gourgou


Avatar
Fabien LE LEZ
On 01 Mar 2004 10:48:20 GMT, "Michaël Delva"
wrote:

struct Index_Joueur
{
AnsiString nom_equipe,
nom_joueur;
int index_du_joueur;
}

et le vecteur suivant:

std::vector<Index_Joueur> liste_index_joueurs;

Je veux pouvoir chercher le nom d'un joueur grâce au nom de l'équipe et à
son index.


class Compare_Index_Joueur
{
public:
Compare_Index_Joueur (AnsiString const& nom_equipe_,
int index_du_joueur_)
: nom_equipe (nom_equipe_)
, index_du_joueur (index_du_joueur_)
{}
bool operator == (Index_Joueur const& idx) const
{ return idx.nom_equipe==nom_equipe
&& idx.index_du_joueur.index_du_joueur; }

private:
AnsiString nom_equipe;
int index_du_joueur;
};

std::find_if
(liste_index_joueurs.begin(),liste_index_joueurs.end(),
Compare_Index_Joueur (nom_equipe_cherchee, index_joueur_cherche));

Quant à ton operator==, il me paraît louche -- cf message de
Gourgouilloult.

--
;-)