如何以相反的顺序读取 C++ 程序的输入?
How to read input to a C++ program in reverse order?
假设我按如下方式向 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
,...
没有.
您需要在数据流入输入流时读取它们。
然后在您的程序中,您可以按照您喜欢的任何方式重新排序它们。
如评论中所述,最好的方法是按照给定的顺序阅读它们,然后再对它们进行排序。
// 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.
其次,您可以创建一个内部循环,将数字相加。
我不确定代码是否 运行 但逻辑可以帮助你。
我正在使用堆栈实现伪代码!
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;
}
您需要将接受的输入包装在一些为您重新排序值的功能中。您也许可以在程序之外这样做,即通过另一个对值进行重新排序的程序来传输输入流。那么您的代码可能已经可以正常工作了。
或者你在你的程序中做这个包装。例如,使用类似自定义流的 class 来缓冲介于两者之间的值。
如果不使用额外的内存来缓冲您还不需要的值,就无法完成此操作。
示例:
#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();
}
}
}
}
假设我按如下方式向 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
,...
没有.
您需要在数据流入输入流时读取它们。
然后在您的程序中,您可以按照您喜欢的任何方式重新排序它们。
如评论中所述,最好的方法是按照给定的顺序阅读它们,然后再对它们进行排序。
// 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.
其次,您可以创建一个内部循环,将数字相加。
我不确定代码是否 运行 但逻辑可以帮助你。
我正在使用堆栈实现伪代码!
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;
}
您需要将接受的输入包装在一些为您重新排序值的功能中。您也许可以在程序之外这样做,即通过另一个对值进行重新排序的程序来传输输入流。那么您的代码可能已经可以正常工作了。
或者你在你的程序中做这个包装。例如,使用类似自定义流的 class 来缓冲介于两者之间的值。
如果不使用额外的内存来缓冲您还不需要的值,就无法完成此操作。
示例:
#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();
}
}
}
}