【问题标题】:Searching first specified element in array搜索数组中的第一个指定元素
【发布时间】:2013-06-05 11:37:03
【问题描述】:

我正在尝试制作具有循环的函数,该循环检查由布尔变量组成的数组的每个成员,并在找到第一个“真”值时退出。

这就是我现在所拥有的:

    bool solids[50];
    int a,i;

//"equality" is a function that checks the equality between "a" and a defined value
solids[0] = equality(a,&value_1); 
solids[1] = equality(a,&value_1);
solids[2] = equality(a,&value_1);
solids[3] = equality(a,&value_1);

for (i = 0; solids[i] != true; i++)
{

[...]

}

但我不知道,我应该在循环中放什么?

我的尝试是

for (i = 0; i <= 50; i++)
{
    if (solids[i] == true)
    {
    return true;
    break;
    } else {
    return false;
    }
}

,如果数组没有具有true 值的成员,则应在第一次找到true 后返回true 并返回false,但它似乎在代码中不起作用。

错了吗?如果有,有什么问题?

PS.:我可以用计数器计算 trues 的数量,但这不是解决问题的最佳方法,因为我只查找第一个 true 值,因此,程序不必检查所有 50 个成员。需要数数,这个解决方案意味着多少不必要的步骤。

【问题讨论】:

  • 只需使用std::find
  • 您不需要else 部分。想一想 - 它为第一个非真值返回 false,因此它停止搜索。
  • break after return 是没有意义的,因为编译器永远不会到达它。良好的算法实践建议不要在传统的for(;;) 循环中使用循环控制语句(如breakcontinue),而只能在while 循环中使用。 for(;;) 意味着从起始值开始并在达到结束条件时结束,以帮助保持代码可读性。仅供参考,无论如何......当然,不要重新发明轮子,使用std::find
  • 在第一个例子中,如果 none 个条目是 true 怎么办?然后你将继续循环,也许永远。在第二个示例中,您只循环一次到多次(使用 i &lt; 50 代替)。
  • @zmo 你提到的做法听起来很傻。如果你把循环放在一个足够短的函数中,很明显它会过早退出。

标签: c++ arrays function loops optimization


【解决方案1】:

一旦您正确设置了实体(看起来您当前正在将每个值都设置为相同的值),您可以创建一个在第一个 true 时退出的循环,如下所示:

for (i = 0; i < 50; i++)
{
    if (solids[i] == true)
    {
        return true;
    } 
}
return false;

我也只是将i 的声明移到for 循环体中,因为它不在外部使用,但以上回答了您的问题。

【讨论】:

  • i&lt;=50 是 50 项数组的不正确条件。应该是i&lt;50
  • 没错,我复制了那个循环并没有检查它
【解决方案2】:

return 立即退出函数,所以后面不需要break 循环。

如果在搜索后立即退出函数就足够了,您应该编写如下内容:

for (int i = 0; i < 50; i++) {
  if (solids[i]) return true;
}
return false;

如果需要在同一个函数中使用搜索结果,请使用附加变量:

bool found = false;
for (int = 0; i < 50; i++) {
  if (solids[i]) {
    bool = true;
    break;
  }
}

if (found) { ...

【讨论】:

    【解决方案3】:

    这是@chris 建议的std::find() 的简短用法示例:

    bool find_element_in_array() {
        bool solids[50];
        int length;
    
        /* ... do many operations, and keep length as the size of values inserted in solids */
    
        bool* location = std::find(solids, length, true);
        // if element is found return true
        if (location != solids + length)
            return true;
        // else return false
        return false;
    }
    

    【讨论】:

    • 谢谢!你不是忘了排第一行吗?
    • @ZoltánSchmidt:这不会编译。 std::find 的第二个参数应该是一个迭代器(和第一个参数一样)。该声明还缺少=。我不知道ARRAY_SIZE 来自哪里(应该是length)。
    • 对我犯的一些错误感到抱歉,但在我的 vim 之外我经常做错别字:-) 否则,我主要遵循我提供的链接中的文档和示例,我认为它是@ZoltánSchmidt 的起点,让他适应自己的需求。
    • 这就是为什么我将此答案标记为最佳,因为即使我可以找到std::find 的描述,这对我来说有点新,但你至少试图解释它。 =)
    • 如果您要发布代码作为答案,您至少可以尝试发布正确的代码。注意:您的 std::find 仍然无法编译。
    猜你喜欢
    • 2020-11-28
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2014-04-19
    相关资源
    最近更新 更多