std :: sort()使用swap()交换元素,其中C ++ 11中的swap现在使用swap()中的“move()”语义来避免复制。
我认为这对std :: string特别有用。所以我设计了一个实验来检查这个:
我构造了一个10240000个元素的矢量(std :: string),这些元素是由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;
}
答案 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时速度不快?
因为基于通用移动的交换没有优于已经存在的专用交换。