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;
}
1000W次 字符串反序函数测试,分别测试同样算法,string 和 C风格字符串的区别
string 字符串使用
// STL_Reverse(str); //0.313秒
// good_Reverse(str); //0.875秒
// Reverse(str); //1.063秒
bad_Reverse(str); //7.016秒
C风格字符串使用
// Reverse(cs); //0.578秒
// 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还要多,也许是编译器做了什么优化减轻了它的痛苦。
[解决办法]
VC的STL不使用引用计数,而GCC使用引用计数。
各有利弊。
使用std::string的效率高,应该与引用计数也有一定的关系。
[解决办法]
Loaden说的对,这个问题记得在哪里看到过,vc和gcc的处理不一样,就是ref count的原因。
[解决办法]
楼主怎么测试的时间, 分享一下!!! 这个帖子得收藏,以后用得到
[解决办法]
上面这个gettimeofday
vc里没有,要重写下
[解决办法]
VC6中好像还是引用计数,VS2005,2008改为普通复制
[解决办法]
特地来接分,顺便看看
[解决办法]
LZ试下这个方法效率怎么样,代码如下:
char * reverse(char *str)
{
int iLen = strlen(str);
char *pTemp = str;
for(int i = 0, j = iLen - 1; i < j; i++, j--)
{
pTemp[i]^=pTemp[j];
pTemp[j]^=pTemp[i];
pTemp[i]^=pTemp[j];
}
return pTemp;
}
int main()
{
char szTemp[] = "abcdef";
cout<<reverse(szTemp)<<endl;
}