Re: итератор потока и алгоритм copy_n
От: shank  
Дата: 06.09.06 13:40
Оценка: 7 (2)
Здравствуйте, CiViLiS, Вы писали:
utils::copy_n<std::istream_iterator<char>&>(itr, 2, std::back_inserter(data_));

?
итератор потока и алгоритм copy_n
От: CiViLiS Россия  
Дата: 06.09.06 12:52
Оценка:
Сейчас наткнулся на проблему. Есть код

    std::ifstream file(filename.c_str(), std::ios::binary);
    std::istream_iterator<char> itr(file); 
    std::istream_iterator<char> itr_end;

  char a = *itr;
    utils::copy_n(itr, 2, std::back_inserter(data_)); // это полный аналог фнкции из расширения SGI http://www.sgi.com/tech/stl/copy_n.html
                // template <class InputIterator, class Size, class OutputIterator>
                // OutputIterator copy_n(InputIterator first, Size count, OutputIterator result);
  char b = *itr;


После копирования итератор itr не измениться, так как он передается по значению в copy_n, поэтому а == b всегда. Получается что мы теряем третий байт в файле, так как если выполнить оператор ++ для итератора, то мы считаем уже четвертый байт.
Не дурак сказал я сам себе, вспоминая map.erase, и не долго думая написал
   itr = utils::copy_n(itr, 2, std::back_inserter(data_));

на что ругнулся компилятор -- ибо функция copy_n возвращает итератор назначения, а не источника.

Я знаю как решить проблему поменяв декларация процедуры copy_n (передавать итератор-источник по ссылки или возвращать итератор-источник.). Но что делать если нельзя декларацию и хочется использовать copy_n?

PS Проблема немного упрощена, в реальном коде всё немного сложнее.
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[2]: итератор потока и алгоритм copy_n
От: CiViLiS Россия  
Дата: 06.09.06 14:02
Оценка:
Здравствуйте, shank, Вы писали:

S>Здравствуйте, CiViLiS, Вы писали:

S>
S>utils::copy_n<std::istream_iterator<char>&>(itr, 2, std::back_inserter(data_));
S>

S>?
Надо же, даже работает
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[2]: итератор потока и алгоритм copy_n
От: Roman Odaisky Украина  
Дата: 06.09.06 16:47
Оценка:
Здравствуйте, shank, Вы писали:

S>
utils::copy_n<std::istream_iterator<char>&>(itr, 2, std::back_inserter(data_));

Еще boost::ref можно.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.