如何以相反的顺序读取C ++程序的输入?

时间:2018-01-11 06:33:06

标签: c++ istream

假设我按如下方式向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的下五位数字,...

4 个答案:

答案 0 :(得分:2)

没有

您需要在数据流入输入流时读取数据。

在您的程序中,您可以按照自己喜欢的方式重新排序。

答案 1 :(得分:0)

正如评论中所指出的,最好的方法是按照给出的顺序阅读它们,然后对它们进行排序。

// 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];    
}

答案 2 :(得分:0)

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

首先,您可以在外部循环中插入多少个系列,在上面的测试用例中为3。

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

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

我正在使用stack实现伪代码!

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>create</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <doCheck>false</doCheck>
        <doUpdate>false</doUpdate>
        <providerImplementations>
            <git>jgit</git>
        </providerImplementations>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.scm</groupId>
            <artifactId>maven-scm-provider-jgit</artifactId>
            <version>1.9.5</version>
        </dependency>
    </dependencies>
</plugin>

答案 3 :(得分:0)

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

或者你在程序中执行此操作。例如,使用一个类似于自定义流的类来缓冲它们之间的值。

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

示例:

#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();
            }
        }
    }
}