#include <iostream>
#include <string>
#include <algorithm>
#include <cstring>inline void STL_Reverse(std::string& str) // 反转string字符串 包装STL的reverse()  可以inline
{reverse(str.begin(), str.end());// STL 反转函数 reverse() 的实现/*     template <class BidirectionalIterator>*     void reverse(BidirectionalIterator first, BidirectionalIterator last)*     {*         while ((first != last) && (first != --last))*             swap(*first++, *last);*     }*/
}void bad_Reverse(std::string& str) // 效率低的反转字符串函数
{std::string tmp(str);std::string::size_type ix = str.length() - 1;for (std::string::size_type i = 0; i < str.length(); i++) {str[i] = tmp[ix];ix--;}
}void good_Reverse(std::string &word)   // 仿制STL的算法的,适合string字符串反转函数
{                                      // 效率比 C++ Primer Plus 的高一点
    size_t first, last;first = 0;last = word.size();while ((first != last) && (first != --last))std::swap(word[first++], word[last]);
}void Reverse(std::string &word)   // 适合string字符串反转函数
{                                 // 来源 C++ Primer Plus 第五章 forstr2.cpp -- reversing an arraychar temp;size_t i, j;for (j = 0, i = word.size() - 1; j < i; --i, ++j) {temp = word[i];word[i] = word[j];word[j] = temp;}
}void bad_Reverse(char *str)  // 效率低的反转字符串函数 适合C风格字符串
{char * tmp = new char[strlen(str)];strcpy(tmp, str);size_t ix = strlen(str) - 1;for (size_t i = 0; i < strlen(str); i++) {str[i] = tmp[ix];ix--;}delete[] tmp;
}void good_Reverse(char *word)   // 仿制STL的算法的,适合C风格字符串反转函数
{                               // 效率没有 C++ Primer Plus 的高
    size_t first, last;first = 0;last = strlen(word);while ((first != last) && (first != --last))std::swap(word[first++], word[last]);
}void Reverse(char *word)   // 适合C风格字符串反转函数
{                          // 来源 C++ Primer Plus 第五章 forstr2.cpp -- reversing an arraychar temp;size_t i, j;for (j = 0, i = strlen(word) - 1; j < i; --i, ++j) {temp = word[i];word[i] = word[j];word[j] = temp;}
}int main()
{using namespace std;// 1KW 字符串反序函数测试,分别测试同样算法,string 和 C风格字符串的区别string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";for (int i = 0 ; i != 10000001 ; i++)//  STL_Reverse(str);   //0.313秒//  good_Reverse(str);  //0.875秒//  Reverse(str);       //1.063秒bad_Reverse(str);       //7.016秒cout << str << endl;char cs[] = "0123456789abcdefghijklmnopqrstuvwxyz";for (int i = 0 ; i != 10000001 ; i++)// Reverse(cs);        //0.578秒// good_Reverse(cs);   //0.859秒bad_Reverse(cs);       //13.766秒cout << cs << endl;return 0;
}


#define WIN32  // 如果VC编译器定义WIN32 使用gettimeofday()#include <time.h>
#ifdef WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif
#ifdef WIN32
int gettimeofday(struct timeval *tp, void *tzp)
{time_t clock;struct tm tm;SYSTEMTIME wtm;GetLocalTime(&wtm);tm.tm_year     = wtm.wYear - 1900;tm.tm_mon     = wtm.wMonth - 1;tm.tm_mday     = wtm.wDay;tm.tm_hour     = wtm.wHour;tm.tm_min     = wtm.wMinute;tm.tm_sec     = wtm.wSecond;tm. tm_isdst    = -1;clock = mktime(&tm);tp->tv_sec = clock;tp->tv_usec = wtm.wMilliseconds * 1000;return (0);
}
#endif /* WIN32 */// 测试执行时间代码
    timeval tv;gettimeofday(&tv, NULL);double cl = tv.tv_sec + (double)tv.tv_usec / 1000000;// 添加测试代码
 gettimeofday(&tv, NULL);cl = (tv.tv_sec + (double)tv.tv_usec / 1000000) - cl;printf("\n执行时间 : %0.3f 秒", cl);


_strrev, _wcsrev, _mbsrev
Reverse characters of a string.char *_strrev( char *string );wchar_t *_wcsrev( wchar_t *string );unsigned char *_mbsrev( unsigned char *string );Routine Required Header Compatibility
_strrev <string.h> Win 95, Win NT
_wcsrev <string.h> or <wchar.h> Win 95, Win NT
_mbsrev <mbstring.h> Win 95, Win NT For additional compatibility information, see Compatibility in the Introduction.LibrariesLIBC.LIB Single thread static library, retail version
LIBCMT.LIB Multithread static library, retail version
MSVCRT.LIB Import library for MSVCRT.DLL, retail version Return ValueEach of these functions returns a pointer to the altered string. No return value is reserved to indicate an error.ParameterstringNull-terminated string to reverseRemarksThe _strrev function reverses the order of the characters in string. The terminating null character remains in place. _wcsrev and _mbsrev are wide-character and multibyte-character versions of _strrev. The arguments and return value of _wcsrev are wide-character strings; those of _mbsrev are multibyte-character strings. For _mbsrev, the order of bytes in each multibyte character in string is not changed. These three functions behave identically otherwise. Generic-Text Routine MappingsTCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined
_tcsrev _strrev  _mbsrev  _wcsrev  Example/* STRREV.C: This program checks an input string to* see whether it is a palindrome: that is, whether* it reads the same forward and backward.*/#include <string.h>
#include <stdio.h>void main( void )
{char string[100];int result;printf( "Input a string and I will tell you if it is a palindrome:\n" );gets( string );/* Reverse string and compare (ignore case): */result = _stricmp( string, _strrev( _strdup( string ) ) );if( result == 0 )printf( "The string \"%s\" is a palindrome\n\n", string );elseprintf( "The string \"%s\" is not a palindrome\n\n", string );
}OutputInput a string and I will tell you if it is a palindrome:
Able was I ere I saw Elba
The string "Able was I ere I saw Elba" is a palindromeString Manipulation RoutinesSee Also   strcpy, _strset


#include <iostream>    // 数据流输入/输出
char * my_strrev (char * string )
{char *start = string;char *left = string;char ch;while (*string++) // 找到string 末位的'\0',;             // 因为上面 string++,实际指针在 '\0'的后一个string -= 2;      // 所以退2格,回到字符串最后一个字母while (left < string) {ch = *left;    // 通过临时变量 ch 进行交换*left++ = *string;*string-- = ch;}return(start);
}
using namespace std;int main()
{char h[] = "Hello world!";cout << my_strrev (h) << endl;return 0;
}


//通过不同的方法,实现对所输入字符串的反转,可以很好地复习巩固 C++ 基础知识
/*分析过程:假设要使传递的字符串为常量const字符串,这样操作更加灵活,可直接传递字符串字面值进行反转,常见的解决方法就是,定义一个新的与传递过来字符串长度相等的字符数组,然后进行字符串拷贝,把str字符按从左到右放置到字符数组中,然后采用循环来对字符数组中字符反转
*/
/*第一种,采用以上思路解法,传递为const类型C风格字符指针,返回为char*类型*/
//直接使用字符数组赋值
char* strrev1(const char* str)
{const size_t length = strlen(str);//求字符长度char *temp = new char[length];//新建一个等长度的字符数组strcpy(temp,str);//字符串拷贝for (size_t i = 0; i <= length/2; ++i)//对字符数组中的字符反转,循环执行条件为标识小于或等于字符长度一半
   {char c = temp[i];temp[i] = temp[length - i -1];temp[length - i -1] = c;}return temp;//返回反转后的字符
}
//采用指针操作方式
char* strrev2(const char* str)
{char* tmp = new char[strlen(str)];strcpy(tmp,str);char* ret = tmp;//用来最后返回数组指针char* p = tmp + strlen(str) - 1;while (p > tmp) { char t = *tmp; *tmp++ = *p; *p-- = t;}return ret;
}
//与上一函数基本相似,只不过本函数使用是移位操作改变字符指针指向
char* strrev3(const char* str)
{char* tmp = new char[strlen(str) + 1];strcpy(tmp,str);char* ret = tmp;char* p = tmp + strlen(str) - 1;while (p > tmp) { *p ^= *tmp;*tmp++ ^= *p;          *p-- ^= *tmp;}return ret;
}
//节省几步,直接给新建的字符数组赋反转的值,呵呵,简单明了,只不过循环多执行几次
char* strrev4(const char* str)
{char * temp = new char[strlen(str)];for(int i = 0; i <= strlen(str); i++){temp[i] = str[strlen(str) - i -1];}return temp;
}
//使用递归进行字符反转,网上看的,不过感觉不好,限制太多
//(不能直接反转常量字符串,因为没有定义新的字符数组,而是在原数组上直接进行字符反转,节省空间,提高效率,还要传递字符长度,增加限制,但总归是个思路)
char* strrev5 (char* str,int len)
{if (len <= 1)return str;char t = *str;*str = *(str + len -1);*(str + len -1) = t;return (strrev5(str + 1,len - 2) - 1);
}
/*如果传递是std::string类型字符串且是const的!!返回类型为std::string
*/
std::string strrev6(const std::string str)
{string r ;//定义一个新的字符串变量,用来接收string r;for(int i = 0; i < str.length(); ++i){r = str[i] + r;//注意顺序
   }return r;
}
/*如果传递是std::string类型字符串,但不是const的!!返回类型为std::string,那你将不必再定义一个新的字符串变量节省空间,注意:string类型可以直接接受字符串字面值就是啦..
*/
std::string strrev6(std::string str)
{for(int i = 0; i <= str.length()/2; ++i){char c = str[i];str[i] = str[str.length() - i -1];str[str.length() - i - 1] = c;}return str;
}

[C/C++] String Reverse 字符串 反转相关推荐

  1. Java基础String类-字符串反转

    定义一个方法,实现字符串反转 键盘录入一个字符串,调用该方法后,在控制台输出结果 例如,键盘录入abc,输出结果cba 示例代码: public class HomeworkTest03 {publi ...

  2. Java中的字符串反转方法

    ·首先介绍一下最简单的,利用Java种的StringBuffer来进行反转. public class Test{public static void main(String[] args) {//字 ...

  3. Java 字符串反转

    /*** Reverse 字符串反转* @author Mitten_Crab* @date 2016年10月28日 下午 5:00:50*/ public class Reverse{public ...

  4. 字符串反转python_Python 反转字符串(reverse)的方法小结

    前段时间看到letcode上的元音字母字符串反转的题目,今天来研究一下字符串反转的内容.主要有三种方法: 1.切片法(最简洁的一种) #切片法 def reverse1(): s=input(&quo ...

  5. 回文串判断(string类:反转reverse)

    2029-Palindromes _easy version Problem Description "回文串"是一个正读和反读都一样的字符串,比如"level" ...

  6. java字符串反转reverse();

    package test1;/** 字符串反转的两种方法*/ public class TestReverse {public static void main(String[] args) {Str ...

  7. Java字符串反转函数reverse()

    Java字符串反转函数reverse() package test1;public class TestReverse {public static void main(String[] args) ...

  8. JAVA实现字符串反转(Reverse)的方法(没有最快,只有更快)

    字符串反转在Java程序笔试面试中经常遇到,程序出了满足设计需要外,往往我们还要考虑到性能及内存相关的问题,如果考虑到性能和内存相关的问题,在笔试或面试中更容易赢得考官的青睐. 不多说,给出我这边实现 ...

  9. 第一模块 jdk与jre、==与equals、Math.round(-1.5)、 String、操作字符串的类、字符串反转、抽象类必须要有抽象方法吗、普通类和抽象类、BIO NIO AIO

    1 2   ==与equals 3  Math.round(-1.5) 4  String属于基础的数据类型吗? 5  操作字符串有哪些类,有什么区别 6  字符串反转 7  抽象类必须要有抽象方法吗 ...

最新文章

  1. 网络新高速:T比特网络技术实现成功测试
  2. java word分词器使用_word分词器使用(java)
  3. CDE桌面环境中自动启动应用程序图形界面
  4. hdu 2830(矩形dp)
  5. linux高端内存申请,Linux高端内存
  6. 辗转相除法(欧几里得算法)求 最大公约数与最小公倍数+推论与证明。
  7. 什么是copyonwrite容器
  8. vue获取当前月最后一天_只争朝夕,不负韶华——站在2020年第一天,回望2019最后的两个月...
  9. python从云端数据库获取数据失败_使用%s的Python MySQL Connector数据库查询失败
  10. 生成交叉表的简单通用存储过程
  11. linux 快速启动程序,centos7快速启动应用程序教程
  12. python pandas csv getitem,访问.csv文件时使用Pandas获取KeyError
  13. java batik_[导入]Apache Batik,又爱又恨
  14. Eclipse中文汉化包安装教程
  15. 使用java + selenium + OpenCV破解腾讯防水墙滑动验证码
  16. 诗词温习集:跟梁瀚文一起重温诗词(宋词)之《雨霖铃.寒蝉凄切》宋.柳永
  17. C语言中fflush()、fflush(stdin)、fflush(stdout)
  18. 如何在 R 中计算 Eta 平方
  19. Random不出现重复数字
  20. Python数据结构——对有序表二分查找

热门文章

  1. ambari 2.6.0.0开发环境配置
  2. 3.redis集群部署3主3从
  3. 采访《以魂为中心的领导力》作者之问答
  4. The P4 Language Specification v1.0.2 Parser
  5. android之Handler详解
  6. RHELServer6.2下编译GDAL和mysql和proj4支持
  7. jQuery.fn.extend 与 jQuery.extend 用法
  8. textView 父视图alpha设置不影响子视图
  9. Android 通过WebService进行网络编程,使用工具类轻松实现
  10. Android 实现静默安装