Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > std::copy and istream_iterator


Автор: kapusta007 21.11.2019, 01:12
делая примеры из книги STL C++17
наткнулся на такой сюрприз уже не в первый раз вот иследуемый   код

Код

#include <iostream>
#include <string>
#include <iterator>
#include <sstream>
#include <deque>

using namespace std;

int main()
{
    
    istream_iterator<int> it_cin{ cin };
    istream_iterator<int> end_cin;

    deque<int> v;

    //copy(it_cin, end_cin, back_inserter(v));
    for (; it_cin != end_cin; ++it_cin)
        v.push_back(*it_cin);

    istringstream sstr{ "123 456 789" };
    auto deque_middle(next(begin(v), static_cast<int>(v.size()) / 2));

    copy(istream_iterator<int>{sstr}, {}, inserter(v, deque_middle));

    initializer_list<int> il2{ -1, -2, -3 };
    copy(begin(il2), end(il2), front_inserter(v));

    copy(begin(v), end(v), ostream_iterator<int>{cout, ", "});
    cout << '\n';
}


при вставке при помощи алгоритма std::copy(it_cin, end_cin, back_inserter(v)); программа зависает.
решил сделать при помощи цикла for 
Код

for (; it_cin != end_cin; ++it_cin)
        v.push_back(*it_cin);

тоже виснет, но выясняются обстоятельства что когда все элементы пройдены и итератор it_cin инкрементируеться последний раз, чтобы проверить истеность и выйти из цикла,  программа засыпает вот прилагаю скрин


https://savepice.ru/full/2019/11/21/ec945ea1fb37df5dc08b556067649acf-full.png.html 

Автор: xvr 21.11.2019, 14:38
Ctrl-Z нажать не пробовали?

Автор: kapusta007 21.11.2019, 22:15
Спасибо помогло))) а что это значит? можете рассказать?

Автор: kapbepucm 22.11.2019, 10:14
Она не зависает, а ожидает данных из std::cin, при том, что цикл копирования будет повторятся при поступлении новых данных. В вашем коде условие "it_cin != end_cin", если вводить нормальные циферки, всегда выполняется, а "++it_cin" ждёт новых данных. Комбинация клавиш ctrl-Z (не везде будет работать- в моём случае, например, ctrl-D) делает условие "it_cin != end_cin" невыполнимым.

Автор: kapusta007 22.11.2019, 21:26
kapbepucm, Спасибо за объяснение)) а как тогда прервать считку данных кроме как использование хоткеев? или понять что данные завершились?

Автор: xvr 25.11.2019, 14:28
Цитата(kapusta007 @  22.11.2019,  21:26 Найти цитируемый пост)
 а как тогда прервать считку данных кроме как использование хоткеев?

Ctrl-Z это не хоткей. Это стандартный способ для консольного потока завершиться. Он на эту комбинацию и выдаёт EOF
Если вы запустите свою программу с перенаправлением ввода (prog.exe <file.txt), то никаких Ctrl-Z будет не нужно - прочтётся файл file.txt и в конце выдаст EOF

Либо читайте из входного потока построчно и сами решаёте, когда завершать программу по анализу того, что прочли.

Автор: kapbepucm 26.11.2019, 12:33
Цитата(kapusta007 @  22.11.2019,  21:26 Найти цитируемый пост)
а как тогда прервать считку данных кроме как использование хоткеев?
Ну да, вариантов несколько, как упоминал xvr. Я бы в цикле
Код

    for (; it_cin != end_cin; ++it_cin)
        v.push_back(*it_cin);
делал досрочный выход по какому нибудь условию.

Автор: kapusta007 1.12.2019, 23:15
Парни спасибо за объяснение)))!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)