std :: sort() verwendet swap(), um Elemente auszutauschen, wobei swap jetzt in C++ 11 die Semantik "move()" in swap() verwendet, um das Kopieren zu vermeiden.Warum C++ 11 std :: sort() ist nicht schneller beim Sortieren von std :: string?
Ich denke, das ist besonders nützlich für std :: string. Also habe ich ein Experiment entworfen, um dies zu überprüfen out:
ich einen Vektor von 10.240.000 Elementen (std :: string) konstruiert werden diese Elemente durch den Zufall() Funktion konstruiert.
Verwenden Sie std :: sort, um alle Elemente zu sortieren und die Zeitdauer auszudrucken.
#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;
}
Wenn die Zeichenfolgen klein sind, verwenden sie wahrscheinlich SBO, das nicht von der Verschiebungssemantik profitiert. Versuchen Sie es mit langen Saiten. –
Ich sehe hier wirklich keine * Frage *? Welche Ergebnisse bekommst du? Was hast du erwartet? Womit vergleichen Sie die Ergebnisse? –
Dies ist ein Fall, in dem std :: stable_sort (basierend auf merge sort) schneller ist als std: sort (basierend auf Quick Sort). – rcgldr