reverse()反转字符串函数的评测,请大牛们解释一下原因
#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 array
char 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 array
char 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;
}
// good_Reverse(cs); //0.859秒
bad_Reverse(cs); //13.766秒
[解决办法]
我想C风格效率低的一个主要原因还是:strlen 的调用。
而string已经把长度保存下来了。
[解决办法]
楼主牛人,接分= =最近问问题没分了快,楼主多给几分我吧,顺便帮你顶起
[解决办法]
// STL_Reverse(str); //0.313秒
// good_Reverse(str); //0.875秒
// Reverse(str); //1.063秒
估计good_Reverse比STL_Reverse多了0.5秒是因为它使用了1KW次last = word.size();这个函数也许被实现成需要计算才能得到的。
Reverse中用last = word.size();的次数比good_Reverse还要多,也许是编译器做了什么优化减轻了它的痛苦。
[解决办法]