为什么C 11 std :: sort()在排序std :: string时不会更快



std :: sort()使用swap()交换元素,其中现在在c 11中交换move; move; move;Swap()中的语义避免复制。

我认为这对于STD :: String特别有用。因此,我设计了一个实验来检查一下:

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

  2. 使用std ::排序以整理所有元素,并打印出时间持续时间。

#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%cn",
        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 constructionn";
    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<<"secondsn";
    return 0;
}

现在,在C 11中交换的情况下,Swap()中使用" move()"语义避免复制。

这就是现在非专业/非载荷交换()现在所做的。从C 11开始,就已经存在过载std::swap(std::basic_string),并且它永远不需要复制任何一个参数字符串的内存缓冲区。

我认为这对于std :: string

特别有用

由于我在上一段中所说的,尤其是std::string,是一种移动语义对交换没有优势的情况。

对于许多用例,基于通用的移动交换可能足够好,并且可以有效地交换自定义可移动类型,而无需您专门换位。但是,专门的交换仍然可以(可能只是略微)提高效率。

为什么C 11 std :: sort()在排序std :: string?

时不会更快

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

最新更新