如何退出循环并再次继续循环?

时间:2017-04-21 12:48:43

标签: c++ arrays loops

我想编写一个程序来执行以下任务:

我有一个整数数组,

我,作为用户,给出一个整数 s (如word search ),

我希望它进行线性搜索并在数组中找到 s

可能有多个单元格包含所需的 s

代码应该从单元格0开始,搜索,在 n_th 单元格中找到 s

在输出中显示 n

然后离开循环并转到程序的另一部分到标签

然后返回循环搜索 n + 1_th 单元格中的单元格到最后。

我用 goto label 做了这个,但还有其他方法吗?

2 个答案:

答案 0 :(得分:0)

是。可以办到。但首先,我想向您展示简单而优雅的解决方案:

std::vector<int> v = {....};
int to_search = ...;

for (auto elem : v)
{
  if (e == to_search)
  {
     // do something
  }
}

你确定这不是你真正需要的吗?

现在达到你的实际要求:

template <class It, class T>
It find_next(It begin, It end, T to_search)
{
   for (auto it = begin; it != end; ++it)
   {
      if (*it == to_search)
        return it;
   }
   return end;
}
std::vector<int> v = {....};
int to_search = ...;

auto it = v.begin();

while ((it = find_next(it, v.end(), to_search)) != v.end())
{
   // do something with *it
}

您真的想要使用可以轻松调整的索引:

int find_next(const std::vector<int>& v, int begin, int end, int to_search)
{
   for (int i = begin; i != end; ++i)
   {
      if (v[i] == to_search)
        return i;
   }
   return end;
}
std::vector<int> v = {....};
int to_search = ...;

int from = 0;

while ((from = find_next(v, from, v.size(), to_search)) != v.size())
{
   // do something with v[from]
}

现在如果你真的想要原始循环而不是函数,那当然也可以这样做:

std::vector<int> v = {....};
int to_search = ...;

int from = 0;

while (true)
{
   for (; from < v.size(); ++from)
   {
     if (v[from] == to_search)
       break;
   }

   if (from == v.size())
      break;

   // do something with v[from]
}

我希望你能看到我呈现给你的每一次迭代变得更加复杂,基本上做同样的事情。

所以我真的会重新考虑我向你展示的第一个是不是你想要的。

免责声明:未编译,未经过测试

答案 1 :(得分:0)

两种方法的例子,假设它是你感兴趣的索引。

找到元素时调用函数:

void search(const std::vector<int>& v, int x, std::function<void(int)> index_handler)
{
    for (int i = 0; i < v.size(); ++i)
    {
        if (v[i] == x)
        {
            index_handler(i);
        }
    }
}

让来电者确定起点(如std::string::find):

int search_2(const std::vector<int>& v, int x, int start)
{
    for (int i = start; i < v.size(); ++i)
    {
        if (v[i] == x)
        {
            return i;
        }
    }
    return -1;
}

使用示例:

int main()
{
    // Method 1
    std::vector<int> vs = { 1, 2, 1, 2, 1, 2, 3};
    search(vs, 2, [](int i) { std::cout << "found at index " << i << '\n'; });

    // Method 2
    int index = search_2(vs, 2, 0);
    while (index >= 0)
    {
        std::cout << "found at index " << index << '\n';
        index = search_2(vs, 2, index + 1);
    }
}

第二种方法更灵活,但也更麻烦,更容易出错。