я получаю следующий вход со стандартного ввода:istream_iterator потребляет слишком много из потока
2
5
2 1 5 3 4
5
2 5 1 3 4
Первая строка представляет число очередей (назовем это значение n
). Затем для каждой очереди в первой строке есть значение l
, которое обозначает длину очереди, за которой следует фактическая очередь.
Я пытаюсь поставить очереди в вектор с помощью istream_iterator
следующим образом:
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
? Он потребляется итератором? Где я сделал ошибку?
Пройдите через код, построчно, в отладчике. И прекратите затенять переменные, используйте другое имя для итератора во внутреннем цикле. Кроме того, есть ли причина, по которой вы хотите использовать итератор ввода, чем простой цикл, в котором вы получаете значения, используя простой 'std :: cin >> ...'? –
Это и вся теневая вещь на самом деле ошибка, которая произошла, написав этот пример. Я исправил это – user2393256