Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 反转字符串?更好的方法_C++_Arrays_String_Function_For Loop - Fatal编程技术网

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;
}