为什么C ++ 11 std :: sort()在排序std :: string时速度不快?

时间:2016-12-07 15:04:00

标签: string sorting c++11 move swap

std :: sort()使用swap()交换元素,其中C ++ 11中的swap现在使用swap()中的“move()”语义来避免复制。

我认为这对std :: string特别有用。所以我设计了一个实验来检查这个:

  
      
  1. 我构造了一个10240000个元素的矢量(std :: string),这些元素是由randomString()函数构造的。

  2.   
  3. 使用std :: sort来整理所有元素,并打印出持续时间。

  4.   
#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;
}

1 个答案:

答案 0 :(得分:4)

  

现在C ++ 11中的swap使用swap()中的“move()”语义来避免复制。

这就是非专用/非重载swap()现在的作用。从C ++ 11开始就有一个重载std::swap(std::basic_string),它从来不需要复制任何一个参数字符串的内存缓冲区。

  

我认为这对std :: string

特别有用

由于我在上一段中所说的,std::string特别是移动语义不会给交换带来任何好处。

基于通用移动的交换对于许多用例来说可能已经足够好了,它允许自定义可移动类型的交换,而不需要专门交换。但是,专业交换仍然可以(可能只是略微)更高效。

  

为什么C ++ 11 std :: sort()在排序std :: string时速度不快?

因为基于通用移动的交换没有优于已经存在的专用交换。