【问题标题】:How to check presence of an element in C++ array如何检查 C++ 数组中的元素是否存在
【发布时间】:2015-05-21 04:07:40
【问题描述】:

对于如何编写一些代码来检查二维数组中的任何位置是否包含某个变量,我有点困惑。

想象一个 8x8 的二维数组,每个元素的值都是 -1、0 或 1。只有在数组中同时找到 -1 和 1 时,我才想继续运行代码。

我的问题是我只知道如何遍历整个数组,以便我可以获取最后一个元素的值并测试它是 -1 还是 1,而不是测试是否 any 的数组元素是 1 或 -1。

我希望下面的代码说明了我正在尝试做的事情。谢谢。

for(int x=0; x<8; x++)
{
    for(int y=0; y<8; y++)
    {
        if(array[x][y] == 1)
        {
            stop checking
            oneExists = true;
        }
        if(array[x][y] == -1)
        {
            stop checking
            minusoneExists = true;
        }
        else
        {
            oneExists = false;
            minusoneExists = false;
        }
    }

    if(oneExists==true & minusoneExists==true)
    {
        return true;
    }
    else
    {
        return false;
    }
}

【问题讨论】:

  • 使用break 语句退出for 循环。
  • 我想到了,但是如果我在前两个 if 语句中的任何一个中放了 break,它只会退出那些而不是 for 循环,但是如果我把它放在前两个 for 循环中,它们会在第一个元素上退出。有没有办法做到这一点,我错过了?
  • 所以我猜你需要某种 (bool) 标志变量来指示何时必须退出两个 for 循环。

标签: c++ arrays search


【解决方案1】:

像下面这样的东西可能会奏效:

oneExists = false;
minusoneExists = false;

for(int x=0; x<8 && ! (oneExists && minusoneExists); x++)
{
    for(int y=0; y<8  && ! (oneExists && minusoneExists); y++)
    {
        if(array[x][y] == 1)
        {
            oneExists = true;
        }
        if(array[x][y] == -1)
        {
            minusoneExists = true;
        }
    }
}

return oneExists && minusoneExists;

【讨论】:

  • 这非常接近,但问题是如果我们想象第一个元素是 1,那么情况就是这样:oneExists=true &amp; minusoneExists=false。到目前为止一切都很好,但是然后转到第二个元素,如果它是 -1,现在:oneExists=false &amp; minusoneExists=true。在这种情况下,我需要 oneExists 始终等于 true,如果它曾经在循环中这样做过并且不会恢复到 false
  • 这两个布尔标志仅在双循环开始之前设置为 false。因此它们永远不会在循环内恢复为 false。
【解决方案2】:

这个怎么样:

bool oneExists = false;
bool minusoneExists = false;
for(int x=0; x<8; x++)
{
    for(int y=0; y<8; y++)
    {
        if(array[x][y] == 1)
        {
            oneExists = true;
        }
        else if(array[x][y] == -1)
        {
            minusoneExists = true;
        }
        if(oneExists && minusoneExists) return true;
    }
}
return false;

【讨论】:

    【解决方案3】:

    这个怎么样。

        for(int x=0; x<8; x++)
        {
            bool flag=true;
            for(int y=0; y<8; y++)
            {
                if(array[x][y]==0)
                {
                    flag=false;
                    break;
                }
            }
    
            if(!flag)
                return false;
    
        }
        return true;
    

    【讨论】:

      【解决方案4】:

      使用标准库:

      bool contains(const int (&m)[8][8], int value)
      {
          return std::any_of(std::begin(m), std::end(m), [value](const auto&a)
          {
              return std::any_of(std::begin(a), std::end(a), [value](int e)
              {
                  return e == value;
              });
          });
      }
      
      bool contain_one_and_minus_one(const int (&m)[8][8])
      {
          return contains(m, 1) && contains(m, -1);
      }
      

      Live Demo

      【讨论】:

        猜你喜欢
        • 2012-02-23
        • 2010-12-30
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 2015-09-02
        • 1970-01-01
        相关资源
        最近更新 更多