web-dev-qa-db-fra.com

Comment trouver une valeur particulière dans un tableau et renvoyer son index?

Pseudo Code:

int arr[ 5 ] = { 4, 1, 3, 2, 6 }, x;

x = find(3).arr ; 

x reviendrait alors 2. 

16
rectangletangle

La syntaxe que vous avez là pour votre fonction n'a pas de sens (pourquoi la valeur de retour aurait-elle un membre appelé arr?).

Pour trouver l'index, utilisez std::distance et std::find à partir de l'en-tête <algorithm>.

int x = std::distance(arr, std::find(arr, arr + 5, 3));

Ou vous pouvez en faire une fonction plus générique:

template <typename Iter>
size_t index_of(Iter first, Iter last, typename const std::iterator_traits<Iter>::value_type& x)
{
    size_t i = 0;
    while (first != last && *first != x)
      ++first, ++i;
    return i;
}

Ici, je retourne la longueur de la séquence si la valeur n'est pas trouvée (ce qui est cohérent avec la façon dont les algorithmes STL renvoient le dernier itérateur). Selon vos goûts, vous voudrez peut-être utiliser une autre forme de compte rendu d'échec.

Dans votre cas, vous l'utiliseriez comme suit:

size_t x = index_of(arr, arr + 5, 3);
39
Peter Alexander

Voici un moyen très simple de le faire à la main. Vous pouvez également utiliser le <algorithm>, comme le suggère Peter.

#include <iostream>
int find(int arr[], int len, int seek)
{
    for (int i = 0; i < len; ++i)
    {
        if (arr[i] == seek) return i;
    }
    return -1;
}
int main()
{
    int arr[ 5 ] = { 4, 1, 3, 2, 6 };
    int x = find(arr,5,3);
    std::cout << x << std::endl;    
}
11
Brian

la réponse de fantaisie. Utilisez std :: vector et recherchez avec std :: find

la réponse simple

utiliser une boucle for

3
pm100
#include <vector>
#include <algorithm>

int main()
{
     int arr[5] = {4, 1, 3, 2, 6};
     int x = -1;
     std::vector<int> testVector(arr, arr + sizeof(arr) / sizeof(int) );

     std::vector<int>::iterator it = std::find(testVector.begin(), testVector.end(), 3);
     if (it != testVector.end())
     {
          x = it - testVector.begin();
     }
     return 0;
}

Ou vous pouvez simplement construire un vecteur de manière normale, sans le créer à partir d'un tableau d'ints, puis utiliser la même solution, comme indiqué dans mon exemple.

2
virious
int arr[5] = {4, 1, 3, 2, 6};
vector<int> vec;
int i =0;
int no_to_be_found;

cin >> no_to_be_found;

while(i != 4)
{
    vec.Push_back(arr[i]);
    i++;
}

cout << find(vec.begin(),vec.end(),no_to_be_found) - vec.begin();
1
Nightswatch

Nous utilisons ici simplement la recherche linéaire. Au début initialiser l'index égal à -1. Ensuite, recherchez dans le tableau, le cas échéant, affectez la valeur d'index dans variable d'index et break. Sinon, index = -1.

   int find(int arr[], int n, int key)
   {
     int index = -1;

       for(int i=0; i<n; i++)
       {
          if(arr[i]==key)
          {
            index=i;
            break;
          }
       }
      return index;
    }


 int main()
 {
    int arr[ 5 ] = { 4, 1, 3, 2, 6 };
    int n =  sizeof(arr)/sizeof(arr[0]);
    int x = find(arr ,n, 3);
    cout<<x<<endl;
    return 0;
 }
0
rashedcs

Si le tableau n'est pas trié, vous devrez utiliser recherche linéaire .

0
andand