首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

reverse()反转字符串函数的估测,请大牛们解释一下原因

2013-04-09 
reverse()反转字符串函数的评测,请大牛们解释一下原因#include iostream#include string#include alg

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还要多,也许是编译器做了什么优化减轻了它的痛苦。
[解决办法]

引用:
C/C++ code
Code::Blocks下分别用GCC 4.6和VC2010的编译器,测试成绩
                                   GCC4.6编译器       VC2010编译器
1. STL_Reverse(str);                //0.313秒            //0.563秒
2. C风格 Reverse(cs);  ……

VC的STL不使用引用计数,而GCC使用引用计数。
各有利弊。

使用std::string的效率高,应该与引用计数也有一定的关系。
[解决办法]
Loaden说的对,这个问题记得在哪里看到过,vc和gcc的处理不一样,就是ref count的原因。
[解决办法]
楼主怎么测试的时间, 分享一下!!! 这个帖子得收藏,以后用得到
[解决办法]
上面这个gettimeofday  
vc里没有,要重写下
[解决办法]
引用:
引用:

C/C++ code
Code::Blocks下分别用GCC 4.6和VC2010的编译器,测试成绩
GCC4.6编译器       VC2010编译器
1. STL_Reverse(str);                //0.313秒            //0.563秒
2. C风格 Reverse(cs);  ……

……

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

热点排行
Bad Request.