std :: sort()は要素をスワップするためにswap()を使用します。ここでは、C++ 11ではswap()で "move()"セマンティクスを使用してコピーを回避します。std :: stringをソートするとC++ 11のstd :: sort()が高速にならないのはなぜですか?
これはstd :: stringに特に便利だと思います。だから私はこれをチェックするための実験を設計した:私は10240000個の要素(のstd ::文字列)のベクターを構築し
、これらの要素はrandomString()関数によって構成されています。
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;
}
文字列が小さい場合、SBOを使用している可能性があります。これは、移動セマンティクスのメリットがありません。長い文字列で試してください。 –
私は*ここに*の質問は本当にありませんか?どのような結果が得られますか?あなたは何を期待しましたか?あなたは何を結果と比較していますか? –
これは、std :: stable_sort(マージソートに基づく)がstd:sort(クイックソートに基づく)より速い場合があります。 – rcgldr