std :: sort() использует swap() для замены элементов, где swap теперь в C++ 11 использует семантику move() в swap(), чтобы избежать копирования.Почему C++ 11 std :: sort() не быстрее при сортировке std :: string?
Я думаю, что это особенно полезно для std :: string. Поэтому я разработал эксперимент, чтобы проверить это:
Я построил вектор 10240000 элементов (станд :: строка), эти элементы построены 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