Нет, потому что вам нужно хранить слова, пока не будет выбрано последнее.Сложнее попробовать токенизировать в обратном направлении.
Также нельзя использовать std::copy_backward
, поскольку std::istream_iterator
не является двунаправленным (только ввод).
std::deque
идеально подходит для этой задачи.Вы могли бы также использовать vector
+ back_inserter
и скопировать из v.rbegin()
в v.rend()
в ostream_iterator
.
Кроме того, логика токенизации строки проще всего выражается с помощью istringstream
.
По сути, это выглядит так, что нельзя добиться большего успеха.
Единственная религиозная мелочь - это то, что я не могу стоять using namespace
, даже на уровне блока.
Мое предложение, с таким же количеством строк:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
void output_tokens(const std::string& str)
{
typedef std::istream_iterator<std::string> in_iterator;
typedef std::ostream_iterator<std::string> out_iterator;
std::istringstream in(str);
std::vector<std::string> buffer(in_iterator(in), (in_iterator()));
std::copy(buffer.rbegin(), buffer.rend(), out_iterator(std::cout, "\n"));
}
Важное редактирование: Вам нужна дополнительная пара скобок вокруг in_iterator()
, чтобы избежать синтаксического анализа всего оператора в качестве объявления функции.@ У Стива Джессопа та же проблема.См. этот ошибочный пример , чтобы засвидетельствовать появление сообщения об ошибке, вызывающей растягивание волос, которое возникает в результате такой путаницы.