#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;
}
答案 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());
一起使用