C 如果我能';如果在if条件中没有定义变量,那么在这段代码中如何减少对数组的多次搜索?

C 如果我能';如果在if条件中没有定义变量,那么在这段代码中如何减少对数组的多次搜索?,c,arrays,C,Arrays,我有一个功能,他的身体看起来很像这样: if (contains(array, element1) > -1){ // do something } else if (contains(array, element2) > -1) { // do something } else if (contains(array, element3) > -1) { // do someting }... 函数con

我有一个功能,他的身体看起来很像这样:

if (contains(array, element1) > -1){
        // do something
    } else if (contains(array, element2) > -1) {
        // do something
    } else if (contains(array, element3) > -1) {
        // do someting
    }...
函数
contains
将在我的数组中循环,检查它是否包含我传递给它的
元素
,如果它存在,则返回它的位置;如果它不存在,则返回-1

在我的
//do something
部分中,我需要这个元素在数组中的位置。我有几种不同的方法可以做到这一点:

  • 我可以再次调用我的
    contains()
    函数来获取位置
  • 我可以定义几个被定义为contain函数返回的变量,然后在if-else块中检查它们。比如:

    int element1Loc = contains(array, element1);
    int element2Loc = contains(array, element2);
    int element3Loc = contains(array, element3);
    
    if (element1Loc > -1){
        // do something
    } else if (element2Loc > -1) {
        // do something
    } else if (element3Loc > -1) {
        // do someting
    }...
    
  • 我可能可以修改
    contain
    以返回
    int数组[2]
    ,无论元素是否在其中,
    array[0]
    等于
    0
    1
    ,然后
    array[1]
    q将等于实际位置,使代码如下所示:

    if (contains(array, element1)[0] > -1){
        // do something
    } else if (contains(array, element2)[0] > -1) {
        // do something
    } else if (contains(array, element3)[0] > -1) {
        // do something
    }...
    
  • 我可以说拧紧if-else块,将
    contains
    的返回保存在一个变量中,并运行几个if语句 解决方案1将在我的阵列中搜索至少两次。解决方案2将搜索至少与我正在查找的元素相同的次数。解决方案3可能是最好的,但可能不是最优雅的。解决方案4将运行每个if语句


    搜索一次最好的方法是什么?我是否应该创建一个函数,它接受我正在查找的所有内容并返回一个包含每个元素位置的数组?我想得太多了吗?

    我会修改
    contains
    以仅使用返回值来指示查找的错误/成功,如果找到了参数,则通过引用输出参数

    int contains(int *data, int value, int *loc)
    {
        for(int i = 0; i < SIZE; i++)
        {
             if(data[i]==value)
             {
                  *loc = i;
                  return 1; // success
             }
        }
        *loc = -1;
        return 0; // failure
    }
    

    您可以传递一个指针,指向
    int
    ,当contains函数找到一个元素时,将填充该指针。然后在
    if
    块中,您将确信
    pos
    是正确的索引

    例如:

    int pos;
    
    if (contains(array, element1, &pos) > -1) {
        // Here you can check pos for the position
    } else if (contains(array, element2, &pos) > -1) {
        // Here you can check pos as well...
    }
    

    这是一个根本不需要修改
    包含的
    的解决方案:

    int-pos;
    if((pos=contains(array,element1))>-1){
    //用pos做点什么
    }如果((pos=contains(array,element2))>-1,则为else{
    //用pos做点什么
    }如果((pos=contains(array,element3))>-1,则为else{
    //用pos做点什么
    }
    

    这是因为大多数命令式语言中的变量赋值都是一个表达式。

    不太好,但您可以执行
    int-elementLoc。。。如果((elementLoc=contains(array,element1))>-1{…
    。那么您只使用一个变量,仅在需要时计算。这太棒了。我不知道您可以指向那样的
    int
    。Govind更快地提供了一个“更完整”的答案比你强,所以我接受他的,但这在我看来同样棒。我特别喜欢你没有实例化几个变量,我认为你不需要这样做(就像加文那样)。谢谢!
    int pos;
    
    if (contains(array, element1, &pos) > -1) {
        // Here you can check pos for the position
    } else if (contains(array, element2, &pos) > -1) {
        // Here you can check pos as well...
    }