【问题标题】:Function problem with iterators and conditions迭代器和条件的函数问题
【发布时间】:2022-01-20 17:12:22
【问题描述】:

我需要检查列表中的每个元素是否不能被我的输入中的任何一个整除,如果条件为真,则将该数字设置为 -1。 问题显然出在功能的某个地方。 功能测试我的一个输入,当条件为真时,它切换到另一个条件,但我需要用一个输入检查整个列表,然后用另一个输入检查整个列表

 #include <vector>
 #include <list>
 #include <functional>
 #include <iostream>

 using namespace std;

 void find_any_default(list < int > & lista, const vector < function < bool(int) >> & funkcije, int def = -1) 
 {
    auto beginl = lista.begin(), endli = lista.end();
    int brojac = 0;
    auto beginv = funkcije.begin(), endv = funkcije.end();
    
    while (beginl != endli) 
    {
       while (beginv != endv) 
       {
          auto g = * beginv;
          
          if ((g( * beginl))) 
          {
             * beginl = -1;
          }
          break;
          ++beginv;
       }
       ++beginl;
    }
 }

 int main() 
 {
    vector < function < bool(int) >> funkcije;
    list < int > lista { 3, 4, 8, 10, 7 };
    int input;
    
    while (cin >> input) 
    {
       auto l = [input](int a) 
       {
          if ((a % input) == 0) 
          {
            return false;
          } 
          else
          {
            return true;
          }
       };
       funkcije.push_back(l);
    }
    
    find_any_default(lista, funkcije);
    
    for (auto i: lista)
    {
       std::cout << i << std::endl;
    }
    return 0;
 }

【问题讨论】:

  • 一个问题是您的break 语句放错了位置。
  • 当您使用调试器运行此代码时,您看到了什么?这就是调试器的用途,如果您不知道如何使用它,这是一个学习在调试器中一次运行程序、监控所有变量及其值变化并分析您的程序的好机会程序的逻辑和执行。您应该可以使用您的调试器在这个和您编写的所有未来程序中发现所有简单的问题,全部由您自己完成。

标签: c++ sorting


【解决方案1】:

为什么要使用那些丑陋的迭代器和 while?只需做两个 for's 和一个 if 并且你准备好了。另外,我不喜欢这样做:

if(x == 'something') 
  return true;
else 
  return false;

我更喜欢直接写:

return x == 'something';

我不知道它是否正常工作,或者即使它正在编译,但我的版本非常快,如下所示:

#include <vector>
#include <list>
#include <functional>
#include <iostream>

using namespace std;

void find_any_default(list<int>& lista, const vector<function<bool(int)>>& funkcije, int def = -1) 
{
  for(auto& val : lista)
  {
    for(auto& fn : funkcije)
    {
      if(fn(val))
      {
        val = def;
        break; // we found one, exit second for - I doubt you need this break here.
      } 
    }
  }
}

int main() 
{
  vector<function<bool(int)>> funkcije;
  list<int> lista { 3, 4, 8, 10, 7 };
  int input;
  while (cin >> input) 
  {
    funkcije.emplace_back(
      [input](int a){ return (a % input) == 0; });
  }

  find_any_default(lista, funkcije);
  for (auto i: lista)
  {
    std::cout << i << std::endl;
  }

  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2020-10-18
    • 2016-06-15
    相关资源
    最近更新 更多