如果给定值则查找数组索引

问题描述 投票:0回答:3

我想检索存储该值的数组中的索引。我知道数组中该点的项目的值。我认为它类似于 c# 中的

findIndex
函数。 例如,
array[2] = {4, 7, 8}
。我知道值为 7,如果我知道索引值 1 位于
array[1]
,如何获取索引值?

arrays c algorithm search indexing
3个回答
11
投票

例如您可以通过以下方式定义相应的函数

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 );
}

您也可以使用 int 类型来代替 size_t 类型。

但更好的方法是使用标头

std::find
中声明的标准算法
std::find_if
<algorithm>
,前提是您使用
C++

例如

#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;
    }
} 

输出是

The index of the element with value 7 is 1

否则你必须自己编写函数,如我上面所示。:)

如果数组已排序,您可以使用标头中声明的标准 C 函数

bsearch
<stdlib.h>

例如

#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;
}

2
投票

首先重要的是参数列表包含数组的大小信息,即传递一个指向数组的指针不能提供足够的信息来了解数组有多少个元素。参数衰减为指针类型,函数没有大小信息。

因此,你可以这样做:

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

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

对于小型阵列,这种方法就可以了。对于非常大的数组,一些排序和二分搜索可以提高性能


1
投票

这是我的版本没有额外的变量

// Return index of element starting
// Return -1 if element is not present
int indexOf(const int elm, const int *ar, int ar_cnt)
{
    // decreasing array count till it reaches negative
    // arr_cnt - 1 to 0
    while (ar_cnt--)
    {
        // Return array index if current element equals provided element
        if (ar[ar_cnt] == elm)
            return ar_cnt;
    }

    // Element not present
    return -1; // Should never reaches this point
}

希望评论是不言自明的!

© www.soinside.com 2019 - 2024. All rights reserved.