OVH Cloud OVH Cloud

index d'un élément d'un vector

5 réponses
Avatar
Patrick Sizun
Bonjour,

Y a-t-il une variante de find renvoyant l'index de l'élément trouvé
plutôt qu'un pointeur sur cet élément ? Où doit-on le faire à la main
ainsi :

vector<double> data;
...
double value = 3.;
int index = -1;
for (int i=0; i<data.size(); i++)
if (data[i] == value) {
index = i;
break;
}

Merci d'avance.

5 réponses

Avatar
twxs
Gabriel Dos Reis wrote:
Patrick Sizun writes:

| Bonjour,
|
| Y a-t-il une variante de find renvoyant l'index de l'élément trouvé
| plutôt qu'un pointeur sur cet élément ? Où doit-on le faire à la main

template<class Iter, class T>
inline int
my_find(Iter begin, Iter end, const T& value)
{
return std::find(begin, end, value) - begin;
}

-- Gaby


il me semble avoir vu qu'il fallait preferer utiliser std::distance. Je
ne sais plus pour quelle raison. quelqu'un peut-il confirmer/infirmer ?

Twxs

Avatar
Gabriel Dos Reis
Patrick Sizun writes:

| Bonjour,
|
| Y a-t-il une variante de find renvoyant l'index de l'élément trouvé
| plutôt qu'un pointeur sur cet élément ? Où doit-on le faire à la main
| ainsi :
|
| vector<double> data;
| ...
| double value = 3.;
| int index = -1;
| for (int i=0; i<data.size(); i++)
| if (data[i] == value) {
| index = i;
| break;
| }

template<class Iter, class T>
inline int
my_find(Iter begin, Iter end, const T& value)
{
return std::find(begin, end, value) - begin;
}

-- Gaby
Avatar
Gabriel Dos Reis
twxs writes:

| Gabriel Dos Reis wrote:
| > Patrick Sizun writes:
| > | Bonjour,
| > | | Y a-t-il une variante de find renvoyant l'index de l'élément
| > trouvé
| > | plutôt qu'un pointeur sur cet élément ? Où doit-on le faire à la main
| > template<class Iter, class T>
| > inline int my_find(Iter begin, Iter end, const T& value)
| > {
| > return std::find(begin, end, value) - begin;
| > }
| > -- Gaby
|
| il me semble avoir vu qu'il fallait preferer utiliser
| std::distance. Je ne sais plus pour quelle raison. quelqu'un peut-il
| confirmer/infirmer ?

S'il parle d'indice dans un vecteur, alors passer par std::distance est une
bonne obfuscation.

-- Gaby
Avatar
Loïc Joly
Gabriel Dos Reis wrote:

Patrick Sizun writes:

| Bonjour,
| | Y a-t-il une variante de find renvoyant l'index de l'élément trouvé
| plutôt qu'un pointeur sur cet élément ? Où doit-on le faire à la main

template<class Iter, class T>
inline int my_find(Iter begin, Iter end, const T& value)
{
return std::find(begin, end, value) - begin;
}




template<class Iter, class T>
inline int my_find(Iter begin, Iter end, const T& value,
Iter vectorBegin = begin)
{
return std::find(begin, end, value) - vectorBegin;
}

il me semble avoir vu qu'il fallait preferer utiliser std::distance. Je
ne sais plus pour quelle raison. quelqu'un peut-il confirmer/infirmer ?


operator- signifie : Si on peut calculer une différence rapidement,
calcule la, sinon fait une belle erreur de compilation.

std::distance signifie : Débrouille tout comme tu veux. Cette distance,
je la veux à n'importe quel prix.

Et comme la notion d'index n'a d'intérêt que si on peut calculer une
distance rapidement...



Au fait, ça me rappelle un question qui traîne dans ma tête depuis
quelques temps. Est-ce que ça un un nom en math les ensembles ou on peut
soustraire deux éléments, pas en ajouter, et dont la différence est un
truc avec lequel on peut faire des additions ou des soustractions, comme
par exemple date/durée, itérateur/distance, point/vecteur...

J'ai l'impression que c'est un concept qu'on retrouve assez souvent.

--
Loïc


Avatar
Falk Tannhäuser
Loïc Joly wrote:
Au fait, ça me rappelle un question qui traîne dans ma tête depuis
quelques temps. Est-ce que ça un un nom en math les ensembles ou on peut
soustraire deux éléments, pas en ajouter, et dont la différence est un
truc avec lequel on peut faire des additions ou des soustractions, comme
par exemple date/durée, itérateur/distance, point/vecteur...


Espace affin ?

Falk