web-dev-qa-db-fra.com

Trouver un index de tableau si une valeur est donnée

Je veux récupérer l'index dans le tableau où la valeur est stockée. Je connais la valeur de l'élément à ce stade du tableau. Je pense que c'est similaire à la fonction findIndex dans c #. Par exemple, array [2] = {4, 7, 8}. Je sais que la valeur est 7, comment puis-je obtenir la valeur de l'index, 1, si je sais qu'il est au tableau [1]?

5
user1798299

Par exemple, vous pouvez définir la fonction correspondante de la manière suivante

size_t FindIndex( const int a[], size_t size, int value )
{
    size_t index = 0;

    while ( index < size && a[index] != value ) ++index;

    return ( index == size ? -1 : index );
}

Aussi, au lieu du type size_t, vous pouvez utiliser le type int.

Mais le meilleur moyen consiste à utiliser l'algorithme standard std::find ou std::find_if déclaré dans l'en-tête <algorithm> à condition que vous utilisiez C++

Par exemple

#include <algorithm>
#include <iterator>

int main()
{
    int a[] = { 4, 7, 8 };

    auto it = std::find( std::begin( a ), std::end( a ), 7 );

    if ( it != std::end( a ) )
    {
        std::cout << "The index of the element with value 7 is " 
                  << std::distance( std::begin( a ), it )
                  << std::endl;
    }
} 

La sortie est

The index of the element with value 7 is 1

Sinon, vous devez écrire vous-même la fonction, comme je l'ai déjà montré. :)

Si le tableau est trié, vous pouvez utiliser la fonction C standard bsearch déclarée dans l'en-tête <stdlib.h>.

Par exemple

#include <stdio.h>
#include <stdlib.h>


int cmp( const void *lhs, const void *rhs )
{
    if ( *( const int * )lhs < *( const int * )rhs ) return -1;
    else if ( *( const int * )rhs < *( const int * )lhs ) return 1;
    else return 0;
}

int main() 
{
    int a[] = { 4, 7, 8 };

    int x = 7;
    int *p  = ( int * )bsearch( &x, a, 3, sizeof( int ), cmp );

    if ( p != NULL ) printf( "%d\n", p - a );

    return 0;
}
8
Vlad from Moscow

Premièrement, il est important que la liste d'arguments contienne des informations sur la taille du tableau, c'est-à-dire que passer un pointeur vers un tableauuniquementne fournit pas assez d'informations pour savoir combien d'éléments le tableau a. L'argument se décompose en un type de pointeur sans information de taille pour la fonction.

Donc, étant donné que, vous pourriez faire quelque chose comme ça:

int findIndex(int *array, size_t size, int target) 
{
    int i=0;
    while((i<size) && (array[i] != target)) i++;

    return (i<size) ? (i) : (-1);
}

Pour les petits tableaux, cette approche sera correcte. Pour les très grands tableaux, un tri et une recherche binaire amélioreraient les performances

0
ryyker