Как я могу написать алгоритм обращения предложений, используя код C ++ более высокого уровня? - PullRequest
0 голосов
/ 16 марта 2011

запустите этот код.Вы можете заменить «жить долго и процветать» на «процветать и жить долго».

#include <stdio.h>
#include <string.h>

void rev(char *l, char *r);


int main(int argc, char *argv[])
{
char buf[] = "live long and prosper";
char *end, *x, *y;

// Reverse the whole sentence first..
for(end=buf; *end; end++);
rev(buf,end-1); 


// Now swap each word within sentence...
x = buf-1; 
y = buf; 

while(x++ < end)
{
if(*x == '\0' || *x == ' ')
{
rev(y,x-1);
y = x+1;
}
} 

// Now print the final string....
printf("%s\n",buf);

return(0);
}


// Function to reverse a string in place...
void rev(char *l,char *r) 
{
char t;
while(l < r) 
{ 
t = *l; 
*l++ = *r; 
*r-- = t; 
}
}

Я хочу знать, в C ++ с помощью заголовка есть ли хороший быстрый способ сделать это?спасибо!

Ответы [ 2 ]

6 голосов
/ 16 марта 2011

Возможно, вы захотите использовать функцию std::reverse, предоставленную в заголовочном файле <algorithm>.

2 голосов
/ 16 марта 2011

Вот один из способов сделать это в 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).

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