Вот один из способов сделать это в C ++:
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>
int main() {
std::istringstream converter("live long and prosper");
std::vector<std::string> words(
(std::istream_iterator<std::string>(converter)),
std::istream_iterator<std::string>());
std::copy(words.rbegin(), words.rend(),
std::ostream_iterator<std::string>(std::cout, " "));
return 0;
}
Эффективность сложнее угадать. Даже при том, что они производят относительно небольшой вывод, оба несомненно связаны с вводом / выводом, но относительно скорость iostreams к потокам C сильно зависит от реализации. Это может пойти в любую сторону - когда-то iostreams почти всегда были медленнее, часто значительно. В настоящее время довольно часто для iostreams быстрее (например, libraw последние переключились на iostreams специально для повышения скорости - и это работало).
Внутренние манипуляции, вероятно, еще менее определенны. Некоторые (многие?) Реализации std::string
включают в себя то, что называется оптимизацией коротких строк («SSO»). Это выделяет небольшой (например, 20-байтовый) блок хранения как часть самого строкового объекта. Если строка достаточно короткая, чтобы туда поместиться, это позволяет избежать отдельного выделения контента. Аналогично, std::vector
выделяет необработанную память в блоках, а затем создает строки в этой памяти. Учитывая небольшой размер и количество задействованных здесь строк, вполне вероятно, что вся память для всего вектора строк будет выделена как один блок в одном выделении. В этом случае это довольно хороший шанс быть быстрее, чем версия C - в вашей версии C каждый байт ввода копируется один раз, чтобы перевернуть всю строку, и снова, чтобы перевернуть отдельные слова, тогда как каждый из них копируется только один раз. , OTOH, если бы у вас было больше строк, или они были длиннее (слишком длинны, чтобы уместиться в области единого входа), у вас было бы более динамическое распределение, которое, вероятно, замедлило бы (хотя точно, насколько сложно оценить, и, очевидно, зависит от менеджер кучи ...)
В то же время, это, безусловно, использует больше памяти, и в зависимости от того, как именно эта память выделяется, может использовать более динамическое выделение памяти (например, если начальное выделение для std::vector
меньше 4 элементов, и / или ваша строка не содержит единого входа).
Суть в том, что скорость версии C ++ во многом зависит от качества реализации. Со старым компилятором / стандартной библиотекой (например, gcc 2.x, VC ++ 6) я ожидал, что он будет медленнее - возможно, намного медленнее. С текущей реализацией я ожидал бы, что это будет быстрее - возможно, немного быстрее. Разница между самой медленной и самой быстрой реализациями может легко составить 4: 1 (хотя большая часть этого в реализации iostreams).