如果无法在if条件内定义变量,如何减少此代码中对数组的多次搜索?

时间:2019-02-18 03:54:58

标签: 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
    }...

函数contains将遍历我的数组,并检查它是否包含我传递给它的element并返回它的位置(如果存在)或-1(如果不存在) 。

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

  1. 我可以再次调用contains()函数来获取职位。
  2. 我可以定义几个定义为包含函数返回的变量,然后在我的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
    }...
    
  3. 我也许可以修改contain来返回int array[2],无论元素是否在其中,array[0]等于01。否,然后array[1]将等于实际位置,使代码看起来像这样:

    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
    }...
    
  4. 我可以说拧if-else块,将contains的返回值保存在变量中,并运行几个if语句。

解决方案一将搜索我的数组至少两次。解决方案二将至少搜索我要查找的元素的次数。解决方案3也许是最好的,但也许不是最优雅的。解决方案4将运行每个if语句...

仅搜索一次的最佳方法是什么?我是否应该编写一个函数,将需要的所有内容都返回给一个包含每个元素位置的数组?我在想什么吗?

3 个答案:

答案 0 :(得分:2)

我将修改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 elem1loc, elem2loc, elem3loc;
if(contains(data, val1, &elem1loc))
     // use elem1loc...
if(contains(data, val2, &elem2loc))
     // use elem2loc...  

答案 1 :(得分:2)

您可以传递一个指向int的指针,当包含函数找到一个元素时,该指针将被填充。然后,可以在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...
}

答案 2 :(得分:1)

这里的解决方案根本不需要您修改contains

int pos;

if ((pos = contains(array, element1)) > -1) {
    // do something with pos
} else if ((pos = contains(array, element2)) > -1) {
    // do something with pos
} else if ((pos = contains(array, element3)) > -1) {
    // do something with pos
}

之所以可行,是因为大多数命令式语言中的变量赋值是一个表达式。