Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоковые итераторы 
:(
    Опции темы
DmKiselev
Дата 16.6.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Здравствуйте, мне нужно с помощью итератора входного потока прочитать из файла последовательность чисел и записать их в вектор. Вот что я написал:
Код

#include "stdio.h"
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <locale.h>
using namespace std;

int main(void)
{
    setlocale(LC_ALL, "Russian");
    vector<int> v;
    cout<<"Число элементов в v: "<<v.size()<<endl;
    if (v.empty()) cout<<"Вектор v пустой."<<endl;
    cout<<"В v может храниться "<<v.capacity()<<" элементов."<<endl;
    ifstream in("inp"); // входной файл
    istream_iterator<int> i(in);
    while ( i != istream_iterator<int>( ) ) // это условие не выполнено сразу
    {
        v.push_back(*i);
        i++;
    }
    cout<<"Число элементов в v: "<<v.size()<<endl;    //пишет ноль
    return 0;
}

Этот блок while я взял из книжки, там был похожий пример, но он не работает, я не знаю почему. Там было написано что условие i == istream_iterator<int>( ) должно быть выполнено только при достижении конца входного потока, т.е. файла. Вобще я до сих пор итераторы вобще не использовал, это первая программа с ними, и мне кажется что я упустил что то элементарное smile Хотя вчера весь вечер искал статьи о них, и всё равно не понятно...
PM MAIL   Вверх
azesmcar
Дата 16.6.2010, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(DmKiselev @  16.6.2010,  16:33 Найти цитируемый пост)
с помощью итератора входного потока прочитать из файла последовательность чисел и записать их в вектор

Код

std::ifstream file("D:\\numbers.txt");
std::vector<int> numbers((std::istream_iterator<int>(file)), (std::istream_iterator<int>()));

PM   Вверх
DmKiselev
Дата 16.6.2010, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



мне нужно создать пустой вектор, а потом уже записать в него числа. Вот задание целиком:
Цитата

*    создайте пустой объект вектор v с типом последовательного контейнера vector, предназначенный для хранения значений целого типа;
*    с помощью итератора входного потока с типом istream_iterator прочитайте из файла "inp.txt" хранящиеся в нем целые значения (разделены символами пробельной группы) и поместите их в объект v;
*    с помощью стандартного алгоритма отсортируйте объект v;
*    с помощью итератора объекта v выведите на экран содержимое объекта v.

PM MAIL   Вверх
DmKiselev
Дата 16.6.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Я всё понял, спасибо  smile 
PM MAIL   Вверх
bsa
Дата 16.6.2010, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



DmKiselev, загружать однотипные данные из потока лучше так:
Код
std::copy(std::istream_iterator<int>(in), std::istream_iterator<int>(), std::back_inserter(v));


Это сообщение отредактировал(а) bsa - 16.6.2010, 19:52
PM   Вверх
DmKiselev
Дата 16.6.2010, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Я сделал так:
Код

v.assign((istream_iterator<int>(file)), (istream_iterator<int>()));

PM MAIL   Вверх
bsa
Дата 16.6.2010, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



DmKiselev, правильно.
PM   Вверх
DmKiselev
Дата 16.6.2010, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



появился ещё вопрос )
чтобы из вектора вывести числа на экран (тоже через поток) я пишу:
Код

for ( vector<bool>::iterator i=v.begin(); i!=v.end(); i++ )
    {
        cout<<*i<<" ";
    }

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

Это сообщение отредактировал(а) DmKiselev - 16.6.2010, 21:25
PM MAIL   Вверх
azesmcar
Дата 16.6.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(DmKiselev @  16.6.2010,  21:21 Найти цитируемый пост)
можно сделать это иначе, не в цикле, а одной операцией? ну что то типа того как я записывал числа в вектор?

Код

#include <algorithm>
...
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n"));


Добавлено через 5 минут и 40 секунд
Цитата(DmKiselev @  16.6.2010,  20:34 Найти цитируемый пост)
v.assign((istream_iterator<int>(file)), (istream_iterator<int>()));

тут скобки не обязательны
вот это прояснит

PM   Вверх
DmKiselev
Дата 16.6.2010, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



ясно smile
PM MAIL   Вверх
DmKiselev
Дата 17.6.2010, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Цитата

с помощью итератора входного потока с типом istream_iterator прочитайте из файла "queue.dat" хранящуюся в нем информацию (значения, разделенные символами пробельной группы) и поместите их в объект q;

Как же это сделать, если q это очередь? там так не получится...
PM MAIL   Вверх
azesmcar
Дата 17.6.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



используй deque
Код

std::deque<int> numbers((std::istream_iterator<int>(file)), (std::istream_iterator<int>()));

queue - контейнерный адаптер, он не поддерживает итераторы. Можно конечно и так
Код

std::deque<int> numbers((std::istream_iterator<int>(file)), (std::istream_iterator<int>()));
std::queue<int> q(numbers);

и вручную, но зачем? queue по умолчанию все равно использует deque.

Это сообщение отредактировал(а) azesmcar - 17.6.2010, 11:12
PM   Вверх
DmKiselev
Дата 17.6.2010, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Я не знаю зачем использовать именно queue, но у меня завтра экзамен, вот и парюсь, выполняю упражнения. Вот оно целиком:
Цитата

* на базе последовательного контейнера list создайте пустой объект очередь q с типом адаптера последовательного контейнера queue, предназначенный для хранения целых значений;
* с помощью итератора входного потока с типом istream_iterator прочитайте из файла "queue.dat" хранящуюся в нем информацию (значения, разделенные символами пробельной группы) и поместите их в объект q;
* выведите на экран содержимое объекта q.

просто в queue нельзя использовать back_inserter. а как можно?
PM MAIL   Вверх
azesmcar
Дата 17.6.2010, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(DmKiselev @  17.6.2010,  11:20 Найти цитируемый пост)
просто в queue нельзя использовать back_inserter. а как можно? 

ну скажем так
Код

std::queue<int> q(std::deque<int>((std::istream_iterator<int>(file)), (std::istream_iterator<int>())));

или так
Код

template <typename T>
struct inserter : std::unary_function<T, void>
{
private:
    std::queue<T>& qref;
public:
    inserter(std::queue<T>& r) : qref(r) {}
    void operator()(const T& v) const {
        qref.push(v);
    }
};


int main()
{
    std::queue<int> q;
    std::for_each(std::istream_iterator<int>(file), std::istream_iterator<int>(), inserter<int>(q));
}

или так
Код

for(std::istream_iterator<int> it = std::istream_iterator<int>(file); it != std::istream_iterator<int>(); ++it)
    q.push(*it);


Это сообщение отредактировал(а) azesmcar - 17.6.2010, 11:29
PM   Вверх
DmKiselev
Дата 17.6.2010, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



последний подошел  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.