【问题标题】:Is it possible to return many values from a loop in a function? C++是否可以从函数的循环中返回许多值? C++
【发布时间】:2017-04-03 20:00:42
【问题描述】:

是否可以从函数内的循环中返回许多值,类似于以下内容:

float MyFunc(float First, float Second)
{
    while (First < Second)
    {
        First++;
        return First;
    }
}

然后能够在返回时打印出不同的值?

(我明白这不是一个很好的做任何事情的方法,但我只是好奇,似乎无法找到一个好的答案。也许我只是不够努力)

【问题讨论】:

  • 使用vector存储和返回。
  • 您正在寻找的是coroutines。它们还不是标准的一部分,但有计划将它们包含在 c++17 中。
  • 您可以返回更复杂的数据类型,或者通过引用传入数组/向量并对其进行修改。
  • @Fang 的提议是 IMO 最正确(但有时过于规范)的方法。

标签: c++ function loops


【解决方案1】:

你可以返回一个向量。

std::vector<float> MyFunc(float First, float Second)
{
    std::vector<float> Result;
    while (First < Second)
    {
        First++;
        Result.push_back(First);
    }
    return(Result);
}

【讨论】:

    【解决方案2】:
    • 虽然您不能像那样返回,但您可以采取多种方式 那。首先,将所有结果放入一个数组或向量中,然后返回 在末尾。但是,这并不意味着立即将它们打印出来 它们被退回。
    • 您可以在循环内调用 print 函数,这样可以确保它们立即打印,然后在最后返回向量。但这似乎也不是您想要的。
    • 您也可以尝试使用多线程。将结果添加到某种形式的并发队列中,然后让另一个线程处理队列中的元素并将它们打印出来。这最接近我认为你想要的,但要复杂得多。

    【讨论】:

      【解决方案3】:

      如果我正确理解了你的问题,你可以做这样的事情 并打印你的数组;

      std::vector<float> MyFunc(float First, float Second)
          {
         std::vector<float> arr(50);
          int i=0;
              while (First < Second)
              {
                  First++;
                  arr[i]=first;
                  i++;
              }
          return arr;
          }
      

      【讨论】:

      • 请将其更改为使用 std::vector&lt;float&gt; 而不是浮点数组。
      【解决方案4】:

      使用协程(在 Visual Studio 2015 Update 3 下工作)看起来像这样:

      generator<float> MyFunc(float First, float Second) {
        while (First < Second) {
            First++;
            co_yield First;
        }
      }
      

      然后你可以写

      for (auto && i : MyFunc(2,7)) { std::cout << i << "\n"; }
      

      Youtube上有一个关于这个的讨论:https://www.youtube.com/watch?v=ZTqHjjm86Bw

      请参阅此处了解您的示例:https://youtu.be/ZTqHjjm86Bw?t=40m10s

      如果您不想等待协程,请查看 boost::range 库。

      或者实现你自己的迭代器

      struct counter {
        counter (int first, int last) : counter {first, last, first} {}
        counter begin () const { return counter {first, last, first}; }
        counter end () const { return counter {first, last, last}; }
        int operator++ () { ++current; }
        int operator* () const { return current; }
      private:
        counter (int first, int last, int current)
          : first (first), last (last), current (current)
          {}
        int first, last, current;
      };
      
      bool operator != (counter a, counter b) { return *a != *b; }
      
      int main() {
          for (auto && i : counter {2,5}) { std::cout << i << "\n"; }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        相关资源
        最近更新 更多