2016-12-07 25 views
1

std :: sort()は要素をスワップするためにswap()を使用します。ここでは、C++ 11ではswap()で "move()"セマンティクスを使用してコピーを回避します。std :: stringをソートするとC++ 11のstd :: sort()が高速にならないのはなぜですか?

これはstd :: stringに特に便利だと思います。だから私はこれをチェックするための実験を設計した:私は10240000個の要素(のstd ::文字列)のベクターを構築し

  1. 、これらの要素はrandomString()関数によって構成されています。

  2. std :: sortを使用してすべての要素を並べ替え、時間を出力します。

#include<string> 
#include<algorithm> 
#include<vector> 
#include<cstdlib> 
#include<cstdio> 
#include<iostream> 
#include<ctime> 
using namespace std; 
string randomString() 
{ 
    int iBuf[10]; 
    for(size_t i=0;i<10;++i) 
    { 
     double rand0to1=(double)rand()/RAND_MAX; 
     iBuf[i]=rand0to1*92+33; 
    } 
    char ret[6]; 
    snprintf(ret, 6, "%c%c%c%c%c\n", 
     iBuf[0],iBuf[1],iBuf[2],iBuf[3],iBuf[4]); 
    return ret; 
} 
int main() 
{ 
    srand(time(NULL)); 
    const size_t scale=10240000; 
    vector<string> vs; 
    vs.reserve(scale); 
    for(size_t i=0;i<scale;++i) 
    { 
     vs.push_back(randomString()); 
    } 
    cout<<vs.size()<<"End vector construction\n"; 
    clock_t begin=clock(); 
    sort(vs.begin(),vs.end()); 
    clock_t end=clock(); 
    double duration=(double)(end-begin)/CLOCKS_PER_SEC; 
    cout<<"sort "<<scale<<"Time elapse="<<duration<<"seconds\n"; 
    return 0; 
} 
+0

文字列が小さい場合、SBOを使用している可能性があります。これは、移動セマンティクスのメリットがありません。長い文字列で試してください。 –

+4

私は*ここに*の質問は本当にありませんか?どのような結果が得られますか?あなたは何を期待しましたか?あなたは何を結果と比較していますか? –

+0

これは、std :: stable_sort(マージソートに基づく)がstd:sort(クイックソートに基づく)より速い場合があります。 – rcgldr

答えて

4

C++ 11件の用途では、今のスワップ "移動()" スワップでのセマンティクス()コピーを避けるために。

これは、特殊化されていない/オーバーロードされていないswap()が現在行っていることです。オーバーロードはC++ 11より前であり、どちらの引数文字列のメモリバッファもコピーする必要がないので、std::swap(std::basic_string)がありました。

私は、これはので、私は最後の段落で言ったのはstd ::文字列

するのに特に有用であると考え、特にstd::stringは、移動セマンティクスがスワップにも利点を導入しない場合です。

一般的な移動ベースのスワップは、多くのユースケースではおそらく十分であり、スワップの特殊化を必要とせずに、カスタムの可動型の効率的なスワップが可能です。しかし、特殊化されたスワップは、依然として(ほんのわずかにしか)効率的ではありません。

なぜstd :: stringをソートするとC++ 11のstd :: sort()が高速にならないのですか?

一般的な移動ベースのスワップは、すでに存在していた特殊なスワップよりも利点がありません。

関連する問題