C++ STL copy函数效率分析

2023-07-11,,

在C++编程中,经常会配到数据的拷贝,如数组之间元素的拷贝,一般的人可能都会用for循环逐个元素进行拷贝,在数据量不大的情况下还可以,如果数据量比较大,那么效率会比较地下。而STL中就提供了一个专门用来进行容器元素拷贝的函数copy。

copy的函数原型如下:

template<class InIt, class OutIt>
OutIt copy(InIt first, InIt last, OutIt x);

第一个参数是要拷贝元素的首地址,第二个参数是元素最后一个元素的下一个位置,第三个参数是拷贝的目的地址,首地址。

下面写一个简单的测试程序分析copy的效率。

vector<int> iVec;
for (int i = 0; i < 1000; i ++)
{
iVec.push_back(i+1);
} int* pInt = new int[iVec.size()]; DWORD t1 = GetTickCount();
std::copy(iVec.begin(),iVec.end(),pInt);
DWORD t2 = GetTickCount();
DWORD tcopy = t2 - t1; DWORD t3 = GetTickCount();
for (int i = 0; i < 1000; i ++)
{
pInt[i] = iVec[i];
}
DWORD t4 = GetTickCount();
DWORD tcopy2 = t4 - t3; printf("copy拷贝的时间为:%d\n",tcopy);
printf("for循环拷贝的时间为:%d\n",tcopy2);

运行截图如下:

可以看出来,数据量比较小的情况下,时间没有差别,那现在我将数组元素的个数改为1000000看看如何。

vector<int> iVec;
for (int i = 0; i < 1000000; i ++)
{
iVec.push_back(i+1);
} int* pInt = new int[iVec.size()]; DWORD t1 = GetTickCount();
std::copy(iVec.begin(),iVec.end(),pInt);
DWORD t2 = GetTickCount();
DWORD tcopy = t2 - t1; DWORD t3 = GetTickCount();
for (int i = 0; i < 1000000; i ++)
{
pInt[i] = iVec[i];
}
DWORD t4 = GetTickCount();
DWORD tcopy2 = t4 - t3; printf("copy拷贝的时间为:%d\n",tcopy);
printf("for循环拷贝的时间为:%d\n",tcopy2);

截图如下:

从图中可以看出,现在差距开始扩大,copy的时间几乎是for循环的20分之一。对数据量稍微大一点,优势逐渐显示出来。

当增加到500万个元素,看看效果如何:

可以看到差距更大了,居然copy的效率是for循环的30倍。

经过这个实验可以看出,当需要拷贝时,如果数据量比较小,两者效率差不多;但是随着数量的增大,copy函数的效率逐渐显现出来。因此,我在这里推荐用copy函数。还有什么更好的方法欢迎大家一起讨论!

C++ STL copy函数效率分析的相关教程结束。

《C++ STL copy函数效率分析.doc》

下载本文的Word格式文档,以方便收藏与打印。