Форум программистов, компьютерный форум CyberForum.ru

Прочитать последовательность слов из потока ввода. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
10.05.2009, 23:58     Прочитать последовательность слов из потока ввода. #1
Прочитать последовательность слов из потока ввода.Пусть слово Quit будет означать конец ввода.Я сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void stream_read()
{
    istream_iterator<string>my_iterator(cin);
    istream_iterator<string>eos;  // Это лишняя строка?
    vector<string>strings_vector(first_vector_size); // const int first_vector_size=1;
    for (unsigned int i=0;i<strings_vector.size();++i)
    {
        strings_vector[i]=*my_iterator;
        if (strings_vector[i]!="Quit") strings_vector.resize(strings_vector.size()+1);
        else break;
        ++my_iterator;
    }
}
Не додумался,как сделать ввод одной строкой,и если Quit присутствует в ней в каком-либо месте,то чтение происходит только до этого места.Можно так сделать?В смысле чтобы сама последовательность символов Quit указывала на конец ввода?Как определить свой страж ввода,отличный от
C++
1
 istream_iterator<string>eos;
?
*Важно* Нужна ли строка
C++
1
 istream_iterator<string>eos;
в этом коде вообще?
P.S.Странно,но по-моему этот код читает в одну строку?...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Humanitis
 Аватар для Humanitis
170 / 162 / 5
Регистрация: 12.01.2009
Сообщений: 430
12.05.2009, 14:53     Прочитать последовательность слов из потока ввода. #2
Цитата Сообщение от #pragma Посмотреть сообщение
Можно так сделать?В смысле чтобы сама последовательность символов Quit указывала на конец ввода?
Нет.
Цитата Сообщение от #pragma Посмотреть сообщение
*Важно* Нужна ли строка
В твоем коде не нужна.

И не делай каждый раз resize контейнеру. Просто добавляй в конец контейнера строку(push_back).
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
13.05.2009, 23:30  [ТС]     Прочитать последовательность слов из потока ввода. #3
Необходимо удалить повторяющиеся элементы и вывести получившуюся последовательность в порядке ввода.Не нашёл подходящего алгоритма в библиотеке.Попробовал сделать через итераторы,но что-то не идёт,получается обращение к несуществующему элементу и Segmentation fault.Как правильно сделать?Не соображаю уже
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void stream_read()
{
    istream_iterator<string>my_iterator(cin);
    vector<string>strings_vector(first_vector_size); // const int first_vector_size=1;
    for (unsigned int i=0;i<strings_vector.size();++i)
    {
        strings_vector[i]=*my_iterator;
        if (strings_vector[i]!="Quit") strings_vector.push_back(*my_iterator);
        else
        {
            strings_vector[i].erase();
            break;
        }
        ++my_iterator;
    }
    vector<string>::iterator a=strings_vector.begin();
    vector<string>::iterator b=strings_vector.begin()+1;
    for (unsigned int i=0;i<strings_vector.size();++i)
       {
         for (unsigned int j=i+1;j<strings_vector.size()+1;++j)
           {
             if (*a==*b) strings_vector.erase(b);
             ++b;
           }
         ++a;
       }
 //   sort(strings_vector.begin(),strings_vector.end());// sort не подходит!
 //   vector<string>::iterator p=unique(strings_vector.begin(),strings_vector.end());
 //   strings_vector.erase(--p,strings_vector.end());
    cout<<endl;
    for (unsigned int i=0;i<strings_vector.size();++i)
        cout<<strings_vector[i]<<endl;
 
}
Humanitis
 Аватар для Humanitis
170 / 162 / 5
Регистрация: 12.01.2009
Сообщений: 430
14.05.2009, 09:58     Прочитать последовательность слов из потока ввода. #4
Работай либо через итераторы ,либо через индексы...не надо все смешивать.
Замени for на while.
Да и после каждого удаления из контейнера,все итераторы связанные с ним надо инициализировать заново, иначе UB.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
14.05.2009, 22:59  [ТС]     Прочитать последовательность слов из потока ввода. #5
А элементы вектора как вообще сравнивать?
C++
1
strings_vector[i]==strings_vector[j]
Что-то не работает,может,строки не сравниваются и всё удаляется?Я уже итераторы убрал,это должно работать,но нет
C++
1
2
3
4
5
6
7
    for (unsigned int i=0;i<strings_vector.size();++i)
       {
         for (unsigned int j=i+1;j<strings_vector.size()+1;++j)
           {
             if (strings_vector[i]==strings_vector[j]) strings_vector[j].erase();
           }
       }
Само по себе использование цикла for не является ошибкой,по крайней мере грубой.В чём ошибка?А функция erase заботится о перемещении(уплотнении) последовательности в памяти после удаления элемента?

Добавлено через 1 час 43 минуты 56 секунд
Ура! Наконец-то дошло,где была ошибка!В цикле я ограничивал индексы элементов i и j размерностью вектора,а она начинается с 1,а не с нуля.Решено!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void stream_read()
{
    istream_iterator<string>my_iterator(cin);
    vector<string>strings_vector(first_vector_size); // const int first_vector_size=1;
    for (unsigned int i=0;i<strings_vector.size();++i)
    {
        strings_vector[i]=*my_iterator;
        if (strings_vector[i]!="Quit") strings_vector.push_back(*my_iterator);
        else
        {
            strings_vector.pop_back();
            break;
        }
        ++my_iterator;
    }
   /********************* TEST BEGIN ***********************/
    cout<<"Before modification:"<<endl;
    cout<<endl<<"Vector size: "<<strings_vector.size()<<endl
              <<"Members: "<<endl;
    for (unsigned int i=0;i<strings_vector.size();++i)
        cout<<strings_vector[i]<<endl;
   /********************* TEST END *************************/
    for (unsigned int i=0;i<strings_vector.size()-1;++i)
       {
         for (unsigned int j=strings_vector.size()-1;j>i;--j)
             {
                if (strings_vector.at(i)==strings_vector.at(j))
                   strings_vector.at(j).erase();
             }
       }
   /********************* TEST BEGIN ***********************/
    cout<<"After modification:"<<endl;
    cout<<endl<<"Vector size: "<<strings_vector.size()<<endl
              <<"Members: "<<endl;
    for (unsigned int i=0;i<strings_vector.size();++i)
        cout<<strings_vector[i]<<endl;
   /********************* TEST END *************************/
}
А почему while предпочтительнее?И ещё меня смущает,что размерность вектора не меняется после удаления элементов,образуются "дыры"!
imeriks
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 3
28.03.2013, 21:06     Прочитать последовательность слов из потока ввода. #6
Скажите, пожалуйста, а вы какие include использовали в начале своей программы?
А то у меня проблема с vector<string> ...(size). Пишет undeclared identifier
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.03.2013, 23:27  [ТС]     Прочитать последовательность слов из потока ввода. #7
Ну Вы даёте, теме 4 года ..
Очевидно, нужно написать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>
   using std::vector;
 
#include <string>
   using std::string;
 
#include <iterator>
   using std::iterator;
 
#include <iostream>
   using std::cout;
   using std::cin;
   using std::endl;
Вроде всё
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 23:58     Прочитать последовательность слов из потока ввода.
Еще ссылки по теме:

C++ Завершение потока ввода
Очистка потока ввода C++
Ошибка потока ввода C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dragsaw
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 6
30.03.2013, 23:58     Прочитать последовательность слов из потока ввода. #8
Цитата Сообщение от #pragma Посмотреть сообщение
как сделать ввод одной строкой,и если Quit присутствует в ней в каком-либо месте,то чтение происходит только до этого места.
пробывали использовать функцию get или getline?
Yandex
Объявления
30.03.2013, 23:58     Прочитать последовательность слов из потока ввода.
Ответ Создать тему
Опции темы

Текущее время: 15:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru