std :: sort()使用swap()交换元素,其中现在在c 11中交换move; move; move;Swap()中的语义避免复制。
我认为这对于STD :: String特别有用。因此,我设计了一个实验来检查一下:
我构造了10240000元素(std :: string)的向量,这些元素是由RandomString()函数构造的。
使用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?
时不会更快
因为基于通用的移动交换比已经存在的专业交换没有任何优势。