2016-12-07 10 views
1

std :: sort() использует swap() для замены элементов, где swap теперь в C++ 11 использует семантику move() в swap(), чтобы избежать копирования.Почему C++ 11 std :: sort() не быстрее при сортировке std :: string?

Я думаю, что это особенно полезно для std :: string. Поэтому я разработал эксперимент, чтобы проверить это:

  1. Я построил вектор 10240000 элементов (станд :: строка), эти элементы построены 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 использований "движение()" семантика в свопа(), чтобы избежать копирования.

Это то, что делает неспециализированная/неперегруженная своп(). Произошла перегрузка std::swap(std::basic_string), так как до C++ 11 ей никогда не приходилось копировать буфер памяти любой строки аргумента.

Я думаю, что это особенно полезно для станд :: строка

Из-за того, что я сказал в последнем абзаце std::string, в частности, случай, когда перемещение семантика не вводить никаких преимуществ замены.

Общий обмен на основе операций, вероятно, достаточно хорош для многих случаев использования, и он обеспечивает эффективную свопинг для настраиваемого подвижного типа без необходимости специализировать своп. Но специализированный своп все еще может быть (возможно, незначительно) более эффективным.

Почему C++ 11 std :: sort() не быстрее при сортировке std :: string?

Поскольку общий обмен на основе операций не имеет преимуществ перед специализированным обменом, который уже существует.

 Смежные вопросы

  • Нет связанных вопросов^_^