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