C++ 反转字符串?更好的方法
您可以使用C++ 反转字符串?更好的方法,c++,arrays,string,function,for-loop,C++,Arrays,String,Function,For Loop,您可以使用std::reverse就地反转字符串,复杂度为(last-first)/2次交换,这正是第一个函数的复杂度,但更简洁 第二种方法有额外分配的开销,这可能会导致速度变慢 我已经用相当大的文件测试了这两个选项 std::reverse(ss.begin(),ss.end())对应于第一个选项(无副本) ss_r=newstd::string(ss.rbegin(),ss.rend())对应于第二个选项(复制) #包括 #包括 #包括 #包括 #包括 //只是为了读取文件 字符串读取文件(
std::reverse
就地反转字符串,复杂度为(last-first)/2次交换,这正是第一个函数的复杂度,但更简洁
第二种方法有额外分配的开销,这可能会导致速度变慢 我已经用相当大的文件测试了这两个选项 std::reverse(ss.begin(),ss.end())代码>对应于第一个选项(无副本)
ss_r=newstd::string(ss.rbegin(),ss.rend())代码>对应于第二个选项(复制)
#包括
#包括
#包括
#包括
#包括
//只是为了读取文件
字符串读取文件(字符*文件名)
{
std::ifstream文件(文件名);
std::字符串ss;
seekg(0,std::ios::end);
STD::CUT原来的方法在一半的字符串上循环,并将另一个字符与另一方的字符交换。你的复制整个字符串,所以假设复制一个字符的代价是交换的一半,结果是相同的。但是,我们没有考虑到你的新方法中所有的开销,但是在幕后发生了这样的开销。s分配新字符串,删除旧字符串并多次调整其大小(尽管这是摊销O(n))。两种方法都是O(n),但第二个几乎不会更快。但为什么不自己计时看看呢?我认为您的代码段中缺少几个字符,但不,这不是一个更好的方法。首先,您正在创建一个新字符串,而不是原地反转,因此内存更大。其次,您正在附加一个std::string
字符-明智的,这(可能)意味着不断调整其内部缓冲区的大小。第三,第一个字符串中的迭代次数仅为字符串大小的一半,而第二个算法必须完全迭代。因此第一个算法更有效为什么不使用std::reverse?效率取决于体系结构,因此没有明确的单一答案。而且在现代系统中,使用SIMD反转可能是最快的方法。但是,将接收反转字符串的过程更改为只使用
#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;
}
string reverse(string s)
{
string reversed ;
for(int is.length();int i >0;--)
{
reversed +=s[i];
}
return reversed;
}
#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;
}