【问题标题】:How to read input to a C++ program in reverse order?如何以相反的顺序读取 C++ 程序的输入?
【发布时间】:2018-01-11 06:33:06
【问题描述】:

假设我给一个 C++ 程序输入如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

C++ 代码:

int n;
for (int i = 0; i < 15; i++)
{
    std::cin >> n;
    // use the value of n to make changes
}

在上面的代码中,我可以顺序读取输入, 即1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

有什么方法可以按以下顺序从输入流中直接读取输入(不使用 C++ 程序中的额外内存):

5 4 3 2 1 10 9 8 7 6 15 14 13 12 11

前五位倒序5 4 3 2 1,后五位倒序10 9 8 7 6,...

【问题讨论】:

  • 是否需要这样读取,还是可以读取后再重新排序?
  • 逆流游泳.....
  • 听起来你想把它们放在一个数组中(std::vector),然后使用自定义排序函数对数组进行排序(使用std::stort
  • 这可能是the XY Problem?您可以按原样阅读,稍后再重新排序。
  • 没有办法从std::cin 以不同于输入的顺序读取值。读取五个值,排序,输出。重复两次。某些东西(例如数组、对象或容器)需要内存来保存五个值。

标签: c++ istream


【解决方案1】:

没有

您需要在数据流入输入流时对其进行读取。

然后,在您的程序中,您可以以任何您喜欢的方式重新排序它们。

【讨论】:

  • 有一种方法可以倒序读取每 5 个数字。键盘缓冲区可以提供帮助。
  • 我认为这不是 OP 想要的。
【解决方案2】:

正如 cmets 中所述,最好的方法是按照给出的顺序读取它们,然后对它们进行排序。

// vector to hold the values
std::vector<int> values;
values.reserve(15); // reserve for better performance

int n;
for (int i = 0; i < 15; i++)
{
    std::cin >> n;
    values.push_back(n); // add value to back of vector
}

// sort the vector
std::sort(values.begin(), values.end());

// use the values in ascending order...
for (int i = 0; i < 15; i++) {
    std::cout << values[i];    
}

【讨论】:

    【解决方案3】:

    是的,这是可能的,但它会增加代码的运行时间复杂度。

    首先你可以为它插入多少个系列制作外循环,在上面的测试用例中它是 3。

    其次,您可以创建一个添加数字的内部循环。

    我不确定代码是否正在运行,但逻辑可以帮助您。

    我正在使用堆栈实现伪代码!

    int n=5;
    for(int count = 1 ; count <= 3 ;count++)
    {
       for(int i=n ; i > n-5 ; i++)
        {
          push_on_stack(i);
        }
     n=n+5;
    }
    

    【讨论】:

      【解决方案4】:

      您需要将您的输入包含在一些功能中,以便为您重新排序值。您可能可以在程序之外执行此操作,即通过另一个对值重新排序的程序管道输入流。那么您的代码可能已经像现在一样工作了。

      或者你在你的程序中做这个包装。例如,使用自定义的类流类来缓冲其间的值。

      如果不使用额外的内存来缓冲您不需要的值,就无法完成这项工作。

      例子:

      #include <iostream>
      #include <stack>
      
      struct reader {
          std::stack<int> data;
          reader& operator>>(int & i) {
              if (data.empty()) {
                  while (data.size() < 5) {
                      data.push(0);
                      std::cin >> data.top();
                  }
              }
              i = data.top();
              data.pop();
              return *this;
          }
          explicit operator bool() const { return bool(std::cin); }
      };
      
      int main () {
          reader r;
          int i;
          while (r >> i) {
              std::cout << i << std::endl;
          }
      }
      

      示例输出:

      $ g++ tt.cc -std=c++11 && echo "1 2 3 4 5 6 7 8 9 10" | ./a.out
      5
      4
      3
      2
      1
      10
      9
      8
      7
      6
      

      更直接的方法可能是这样的:

      #include <iostream>
      #include <vector>
      
      int main () {
          std::vector<int> buffer;
          for (int i; std::cin >> i; ) {
              buffer.push_back(i);
              if (buffer.size() == 5) {
                  // do something with buffer
                  //std::vector<int> reversed(buffer.rbegin(), buffer.rend());
                  while (!buffer.empty()) {
                      std::cout << buffer.back() << "\n";
                      buffer.pop_back();
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-19
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-05
        相关资源
        最近更新 更多