В какой ситуации следует использовать приращение ostream_iterator? - PullRequest
2 голосов
/ 16 января 2011
std::istream_iterator<std::string> ist(std::cin);
std::istream_iterator<std::string> eof;
std::vector<std::string> str_vec(ist, eof);
std::ofstream ofs("a");
if (!ofs) {
    throw std::runtime_error("Open file failed.");
}
std::ostream_iterator<std::string> ost(ofs, "\n");
for (size_t index = 0; index != str_vec.size(); ++index) {
    //*ost = str_vec[index];
    *ost++ = str_vec[index];
}

Я получил один и тот же результат, независимо от того, использую я * ost ++ или нет.Я знаю значение приращения istream_iterator.Но в какой ситуации следует использовать приращение ostream_iterator?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 16 января 2011

Дальнейшие эксперименты могут показать, что вам даже не нужно разыменовывать итератор, чтобы он работал.:)

ost = str_vec[index];

Все эти неактивные методы необходимы для того, чтобы потоковые итераторы были похожи на интерфейсы с другими итераторами.

Вместо ручного цикла вы можете использовать std::copyалгоритм.(Так как это почти все, для чего подходит ostream_iterator, это своего рода ответ на ваш вопрос: вам вообще не нужно возиться с этими итераторами в вашем собственном коде!)

 std::copy(str_vec.begin(), str_vec.end(), std::ostream_iterator<std::string>(ofs, "\n"));

Учитываякак написан шаблон функции копирования, может стать ясно, где необходимы приращения и разыменование:

template <class InIter, class OutIter>
void copy(InIter begin, InIter end, OutIter result)
{
    for (InIter it = begin; it != end; ++it)
        *result++ = *it;  // <-- here, result might be almost any kind of iterator
} 
2 голосов
/ 16 января 2011

Оператор приращения, скорее всего, не используется для ostream_iterator, но он должен предоставлять оператору возможность соответствовать требованиям итераторов вывода.Например, указатель является допустимым выходным итератором, и его необходимо увеличивать.

1 голос
/ 16 января 2011

Ваш алгоритм не должен увеличивать "итератор ostream".Он должен увеличивать выходной итератор .Поэтому всегда увеличивайте выходной итератор, если вы хотите вывести последующий элемент.Таким образом, ваш алгоритм будет поддерживать указатель std::ostream_iterator, а также указатель std::vector<T>::iterator и T*.Инкремент std::ostream_iterator, скорее всего, запрещен, но это не обязательно имеет место с другими итераторами вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...