gpt4 book ai didi

c++ - istream_iterator 从流中消耗太多

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:58 28 4
gpt4 key购买 nike

我从标准输入得到以下输入:

2
5
2 1 5 3 4
5
2 5 1 3 4

第一行代表队列数(我们称这个值为n)。然后,对于每个队列,在第一行有一个值 l 表示队列的长度,后面是实际队列。

我正在尝试使用 istream_iterator 将队列放入 vector 中,如下所示:

using namespace std;
int n{};
int l{};
typedef std::istream_iterator<int> input_iterator;
cin >> n;
cout<< "n: " << n << "\n";
for(int i = 0; i < n ; ++i){

cin >> l;
cout << "l: " << l << "\n";
std::vector<int> queue;
int counter = 0;
for (input_iterator it(cin); counter < l && it != input_iterator(); ++it){
queue.push_back((*it));
++counter;
}
cout<< "Queue: ";
std::copy(queue.begin(), queue.end(),
std::ostream_iterator<int>(std::cout, " "));
cout << "\n";
}

此代码产生以下输出:

n: 2
l: 5
Queue: 2 1 5 3 4
l: 2
Queue: 5 1

如您所见,第一个队列被正确读取。但是第二个 l 应该是 5,而不是 2

5 发生了什么?它被迭代器消耗了吗?我哪里出错了?

最佳答案

您的问题是您的 for 循环将 i 留在队列最后一个元素旁边的位置。因此,当调用 operator>> 来获取 l 的下一个值时,您的“读取步骤”太远了。

为避免此问题,您可以对所有读取操作使用相同的迭代器——并重命名它以避免与外循环中的变量 i 发生名称冲突,如下所示:

using namespace std;
int n{};
int l{};
typedef std::istream_iterator<int> input_iterator;
cin >> n;
cout<< "n: " << n << "\n";
input_iterator it(cin);
for(int i = 0; i < n ; ++i){

l = *(it++);
cout << "l: " << l << "\n";
std::vector<int> queue;
int counter = 0;
while( counter < l && it != input_iterator() ){
queue.push_back(*(it++));
++counter;
}
cout<< "Queue: ";
std::copy(queue.begin(), queue.end(),
std::ostream_iterator<int>(std::cout, " "));
cout << "\n";
}

关于c++ - istream_iterator 从流中消耗太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40673426/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com