vector容器,使用迭代器和使用下标直接引用的效率有什么不同?

sanss2012 2014-05-01 03:16:36
#include <vector>
#include <ctime>
#include <iostream>
using namespace std;

void main()
{
vector<int> arrar(1000000, 2);

clock_t sT1 = clock();
for (size_t i=0; i<arrar.size(); i++)
{
arrar[i]++;
}
clock_t eT1 = clock();

cout << eT1-sT1 << endl;

clock_t sT2 = clock();
for (vector<int>::iterator p=arrar.begin(); p!=arrar.end(); p++)
{
*p++;
}
clock_t eT2 = clock();

cout << eT2-sT2 << endl;
}

最后运行的结果是:第二种的速度比第一种慢了十倍以上!
请问两种方式有什么区别呢?迭代器的效率为什么这么低下啊。。相比下标引用方式还有什么优点呢。。
...全文
1402 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
云谁之殇 2016-11-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <vector>
#include <ctime>
#include "iostream"
using namespace std;

int n = 10000000;

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> vec;
	for (int i = 0; i < n;i++)
	{
		vec.push_back(i);
	}

	int size = vec.size();
	clock_t t1 = clock();
	for (int i = 0; i < size;i++)
	{

	}
	clock_t t2 = clock();
	for (vector<int>::iterator iter = vec.begin(); iter != vec.end();++iter)
	{

	}
	clock_t t3 = clock();
	cout << (t2 - t1) << endl;
	cout << (t3 - t2) << endl;
	return 0;
}
云谁之殇 2016-11-21
  • 打赏
  • 举报
回复
#include "stdafx.h" #include <vector> #include <ctime> #include "iostream" using namespace std; int n = 10000000; int _tmain(int argc, _TCHAR* argv[]) { vector<int> vec; for (int i = 0; i < n;i++) { vec.push_back(i); } int size = vec.size(); clock_t t1 = clock(); for (int i = 0; i < size;i++) { } clock_t t2 = clock(); for (vector<int>::iterator iter = vec.begin(); iter != vec.end();++iter) { } clock_t t3 = clock(); cout << (t2 - t1) << endl; cout << (t3 - t2) << endl; return 0; }
sanss2012 2014-05-04
  • 打赏
  • 举报
回复
引用 14 楼 lovedame 的回复:
建议:
std::for_each(std::begin(array), std::end(array),[](int& x){ ++x;}); 
请问end(array)跟array.end()的区别在哪里呢?
lovedame 2014-05-02
  • 打赏
  • 举报
回复
建议:
std::for_each(std::begin(array), std::end(array),[](int& x){ ++x;}); 
lovedame 2014-05-02
  • 打赏
  • 举报
回复

for (vector<int>::iterator p=arrar.begin(); p!=arrar.end(); p++)
    {
        *p++;
    }
这几句代码有两处使用不当,一处错误 arrar.end() 每次回生成一个临时对象,p++也会生成一个临时对象 *p++可能使p!=arrar.end()永远false
sanss2012 2014-05-01
  • 打赏
  • 举报
回复
....等价代码能不能写对跟用不用debug测试有什么关系么???? 我用VS2008测试的。我就简简单单的把两种所用时间比较了一下。。。你说我测试方法有问题,那么请你指出来呗
引用 11 楼 FancyMouse 的回复:
[quote=引用 9 楼 sanss2012 的回复:] 说了release下的结果差不多的啊,也是第二种方法比第一种慢得多 [quote=引用 7 楼 FancyMouse 的回复:] [quote=引用 4 楼 sanss2012 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] 1. 可能因为你用debug了 2. (*p)++和*p++都不一样……你到底在测啥。
1. 是用的debug, release下的差别虽然没这么大,但还是能明显看出第二种方法比第一种慢得多的。。。 2. 这个是我疏忽了,但即使改过来结果差不多的,你可以运行下看看结果[/quote] debug比性能有啥用?[/quote][/quote] 我拿vc和gcc的测量数据都是在误差以内,没有一种显著更快。你连等价代码都写不对,还用debug测,我还是倾向于认为你测试方法有问题[/quote]
FancyMouse 2014-05-01
  • 打赏
  • 举报
回复
引用 9 楼 sanss2012 的回复:
说了release下的结果差不多的啊,也是第二种方法比第一种慢得多 [quote=引用 7 楼 FancyMouse 的回复:] [quote=引用 4 楼 sanss2012 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] 1. 可能因为你用debug了 2. (*p)++和*p++都不一样……你到底在测啥。
1. 是用的debug, release下的差别虽然没这么大,但还是能明显看出第二种方法比第一种慢得多的。。。 2. 这个是我疏忽了,但即使改过来结果差不多的,你可以运行下看看结果[/quote] debug比性能有啥用?[/quote][/quote] 我拿vc和gcc的测量数据都是在误差以内,没有一种显著更快。你连等价代码都写不对,还用debug测,我还是倾向于认为你测试方法有问题
mujiok2003 2014-05-01
  • 打赏
  • 举报
回复
引用 6 楼 sanss2012 的回复:
我就是想比较下使用STL的时候,迭代器和下标引用的效率差异。。。 [quote=引用 3 楼 zhangyonghui2117 的回复:]

#include <ctime>
#include <iostream>
using namespace std;

void main()
{
	const int n=100000000;
char *arr=new char[n];
	
	clock_t sT1 = clock();
	for(int i=0;i<n;i++)
		arr[i]++;
	clock_t eT1 = clock();
	
	cout << eT1-sT1 << endl;
	
	clock_t sT2 = clock();

	for(int ii=0;ii<n;ii++)
		(*(arr+i))--;
	clock_t eT2 = clock();
	
	cout << eT2-sT2 << endl;
}


// 不用stl,如上的纯数组来说,效率差不多
/*
输出:
465
401
Press any key to continue
 */
[/quote] 不是差不多,这个俩在优化版本(release)中,应该等价。 统计的是误差的,多运行几次然后统计。
sanss2012 2014-05-01
  • 打赏
  • 举报
回复
说了release下的结果差不多的啊,也是第二种方法比第一种慢得多
引用 7 楼 FancyMouse 的回复:
[quote=引用 4 楼 sanss2012 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] 1. 可能因为你用debug了 2. (*p)++和*p++都不一样……你到底在测啥。
1. 是用的debug, release下的差别虽然没这么大,但还是能明显看出第二种方法比第一种慢得多的。。。 2. 这个是我疏忽了,但即使改过来结果差不多的,你可以运行下看看结果[/quote] debug比性能有啥用?[/quote]
乐百川 2014-05-01
  • 打赏
  • 举报
回复
引用 7 楼 FancyMouse 的回复:
[quote=引用 4 楼 sanss2012 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] 1. 可能因为你用debug了 2. (*p)++和*p++都不一样……你到底在测啥。
1. 是用的debug, release下的差别虽然没这么大,但还是能明显看出第二种方法比第一种慢得多的。。。 2. 这个是我疏忽了,但即使改过来结果差不多的,你可以运行下看看结果[/quote] debug比性能有啥用?[/quote] 请问debug 和release有什么区别
FancyMouse 2014-05-01
  • 打赏
  • 举报
回复
引用 4 楼 sanss2012 的回复:
[quote=引用 1 楼 FancyMouse 的回复:] 1. 可能因为你用debug了 2. (*p)++和*p++都不一样……你到底在测啥。
1. 是用的debug, release下的差别虽然没这么大,但还是能明显看出第二种方法比第一种慢得多的。。。 2. 这个是我疏忽了,但即使改过来结果差不多的,你可以运行下看看结果[/quote] debug比性能有啥用?
sanss2012 2014-05-01
  • 打赏
  • 举报
回复
我就是想比较下使用STL的时候,迭代器和下标引用的效率差异。。。
引用 3 楼 zhangyonghui2117 的回复:

#include <ctime>
#include <iostream>
using namespace std;

void main()
{
	const int n=100000000;
char *arr=new char[n];
	
	clock_t sT1 = clock();
	for(int i=0;i<n;i++)
		arr[i]++;
	clock_t eT1 = clock();
	
	cout << eT1-sT1 << endl;
	
	clock_t sT2 = clock();

	for(int ii=0;ii<n;ii++)
		(*(arr+i))--;
	clock_t eT2 = clock();
	
	cout << eT2-sT2 << endl;
}


// 不用stl,如上的纯数组来说,效率差不多
/*
输出:
465
401
Press any key to continue
 */
sanss2012 2014-05-01
  • 打赏
  • 举报
回复
引用 2 楼 zhangyonghui2117 的回复:
以前常听说指针与下标速度差不了太多,这个示例发现确实有区别,我测试的是第一个:73,第二个:13
为毛我们两个的结果完全相反啊。。。我的结果是用迭代器比较慢啊。。。
sanss2012 2014-05-01
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
1. 可能因为你用debug了 2. (*p)++和*p++都不一样……你到底在测啥。
1. 是用的debug, release下的差别虽然没这么大,但还是能明显看出第二种方法比第一种慢得多的。。。 2. 这个是我疏忽了,但即使改过来结果差不多的,你可以运行下看看结果
「已注销」 2014-05-01
  • 打赏
  • 举报
回复

#include <ctime>
#include <iostream>
using namespace std;

void main()
{
	const int n=100000000;
char *arr=new char[n];
	
	clock_t sT1 = clock();
	for(int i=0;i<n;i++)
		arr[i]++;
	clock_t eT1 = clock();
	
	cout << eT1-sT1 << endl;
	
	clock_t sT2 = clock();

	for(int ii=0;ii<n;ii++)
		(*(arr+i))--;
	clock_t eT2 = clock();
	
	cout << eT2-sT2 << endl;
}


// 不用stl,如上的纯数组来说,效率差不多
/*
输出:
465
401
Press any key to continue
 */
「已注销」 2014-05-01
  • 打赏
  • 举报
回复
以前常听说指针与下标速度差不了太多,这个示例发现确实有区别,我测试的是第一个:73,第二个:13
FancyMouse 2014-05-01
  • 打赏
  • 举报
回复
1. 可能因为你用debug了 2. (*p)++和*p++都不一样……你到底在测啥。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧