反转字符串?更好的方法

时间:2019-03-15 10:23:36

标签: c++ arrays string function for-loop

#include<iostream>
#include<string.h>
using namespace std;
int main ()
{
    char str[50], temp;
    int i, j;
    cout << "Enter a string : ";
    gets(str);
    j = strlen(str) - 1;
    for (i = 0; i < j; i++,j--)
    {
        temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
    cout << "\nReverse string : " << str;
    return 0;
}

是否有其他不使用此函数来反转字符串的最佳方法?该函数将从S的最后一个位置开始,并将继续复制反向的字符串。而不是使用tmp变量。

string reverse(string s)
{
    string reversed ;
    for(int is.length();int i >0;--)
    {
        reversed +=s[i];
    }
return reversed;
    }

2 个答案:

答案 0 :(得分:1)

您可以使用std::reverse来就地反转字符串,其复杂度为(last-first)/ 2交换,这恰好是第一个函数的复杂度,但更简洁。

第二种方法具有额外分配的开销,这可能最终会变得更慢。

答案 1 :(得分:0)

我已经用很大的文件测试了这两个选项。

std::reverse(ss.begin(), ss.end());对应第一个选项(无副本)
ss_r = new std::string(ss.rbegin(), ss.rend());对应于第二个选项(副本)

#include <iostream>
#include <fstream>
#include <chrono>
#include <string>
#include <algorithm>
//Just for reading the file
std::string read_file(char * file_name)
{
      std::ifstream file(file_name);

      std::string ss;
      file.seekg(0, std::ios::end);
      std::cout << file.tellg() <<std::endl;
      ss.resize(file.tellg());
      file.seekg(0, std::ios::beg);
      file.read(&ss[0], ss.size());
      file.close();

      return ss;
}
//The real test
int main(int arg, char ** args)
{
      std::string ss = read_file(args[1]);
      std::string * ss_r=NULL;

      std::chrono::time_point<std::chrono::high_resolution_clock> start, end;
      start = std::chrono::high_resolution_clock::now();

      if(args[2]==std::string("copy"))
      {
            //Second option
            ss_r = new std::string(ss.rbegin(), ss.rend());
      }
      else
      {
            //First option
            std::reverse(ss.begin(), ss.end());
      }
      end = std::chrono::high_resolution_clock::now();
      int elapsed_nano_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>
                             (end-start).count();
      if(ss_r!=NULL)
      {
            std::cout<<*ss_r<<std::endl;
      }
      else
      {
            std::cout<<ss<<std::endl;
      }
      std::cout << elapsed_nano_seconds<<std::endl;
}

使用icpc test.cpp -O3 --std = c ++ 11测试

a.out Test_file no_copy在160微秒内运行
a.out Test_file副本的运行时间为320微秒

另一方面,使用第一个选项,您丢失了原始字符串...

因此,总之,如果您不想丢失原始字符串,请与std::reverse一起使用,如果您想使其与std::string(ss.rbegin(), ss.rend());一起使用