LInux下:

gcc 4.47,red hat6

 #include<iostream>
#include<vector>
#include<time.h>
using namespace std; int main() {
//建立4个vector,使用列表初始化,相当与调用拷贝构造函数
vector<int> v1;
int temp;
int i;
for (i = ; i < ; ++i) {
v1.push_back(i);
}
//测试1
clock_t start,end;
start= clock();
for (i = ; i < v1.size(); ++i) {
temp=v1[i];
}
end = clock();
cout << "使用[]运算符耗时:" << (double)(end - start)/CLOCKS_PER_SEC << "s" << endl;
//测试2
start = clock();
for (auto k = v1.begin(); k < v1.end(); ++k)
{
temp = *k;
}
end = clock();
cout << "使用迭代器(++k)耗时:" << (double)(end - start)/CLOCKS_PER_SEC << "s" << endl; //测试3
start = clock(); for (auto k = v1.begin(); k < v1.end(); k++)
{
temp = *k;
}
end = clock();
cout << "使用迭代器,使用k++,而不是++k:" << (double)(end - start)/CLOCKS_PER_SEC << "s" << endl; //测试4
start = clock();
i = ;
for (auto k = v1.begin(); i<v1.size(); ++i,++k)
{
temp = *k;
}
end = clock();
cout << "使用迭代器,不使用end()方法:" << (double)(end - start)/CLOCKS_PER_SEC << "s" << endl; return ;
}

结论:使用[]运算符及size访问最快。

windows下:

vs2015中测试:

 #include<iostream>
#include<vector>
#include<windows.h>
using namespace std; int main() {
//建立4个vector,使用列表初始化,相当与调用拷贝构造函数
vector<int> v1;
int temp;
int i;
for (i = ; i < ; ++i) {
v1.push_back(i);
}
//测试1
DWORD start,end;
start= GetTickCount();
for (i = ; i < v1.size(); ++i) {
temp=v1[i];
}
end = GetTickCount();
cout << "使用[]运算符耗时:" << end - start << "ms" << endl;
//测试2
start = GetTickCount();
for (auto k = v1.begin(); k < v1.end(); ++k)
{
temp = *k;
}
end = GetTickCount();
cout << "使用迭代器(++k)耗时:" << end - start << "ms" << endl; //测试3
start = GetTickCount(); for (auto k = v1.begin(); k < v1.end(); k++)
{
temp = *k;
}
end = GetTickCount();
cout << "使用迭代器,使用k++,而不是++k:" << end - start << "ms" << endl; //测试4
start = GetTickCount();
i = ;
for (auto k = v1.begin(); i<v1.size(); ++i,++k)
{
temp = *k;
}
end = GetTickCount();
cout << "使用迭代器,不使用end()方法:" << end - start << "ms" << endl; system("pause");
return ;
}

输出: 

OK,从分析结果:

当然,如我们只是单纯的从前面两个结果来看,你会发现使用下标运算符的效率会比使用迭代器高一些。其实主要是在访问迭代器是要进行迭代器越位、有效性、是否指向同一容器等方面的判断,比较耗时。我们会发现测试4就是验证我我们的假设,因为执行end()函数是比较耗时的,所以我就不用它,发现迭代器访问会比下标还快。除了这些差别外,我们比较测试2和测试3的结果,会发现测试3比测试2慢了两倍,其实这个也就是为啥我们推荐在写:++k和k++的时候,能用++k,就用++k的原因。

结论:end()函数比较耗时,最好不用。去除end函数耗时,使用迭代器访问比下标快。k++比++k慢很多。

转自:http://blog.csdn.net/qq_35644234/article/details/53195331

访问vector元素方法的效率比较(转)的更多相关文章

  1. StrBlobPtr类——weak_ptr访问vector元素

    #include <iostream> #include <memory> #include <string> #include <initializer_l ...

  2. OpenCV探索之路(十七):Mat和IplImage访问像素的方法总结

    在opencv的编程中,遍历访问图像元素是经常遇到的操作,掌握其方法非常重要,无论是Mat类的像素访问,还是IplImage结构体的访问的方法,都必须扎实掌握,毕竟,图像处理本质上就是对像素的各种操作 ...

  3. c++ vector(向量)使用方法详解(顺序访问vector的多种方式)

    来源:http://www.jb51.net/article/44231.htm 作者: 字体:[增加 减小] 类型:转载 时间:2013-12-08我要评论 vector是向量类型,它可以容纳许多类 ...

  4. struts2 访问Web元素的4种方法

    完整代码 :Struts12AccessWebElement.rar 第一种也是最常用的一种方法实现这几个接口 RequestAware,SessionAware,ApplicationAware s ...

  5. 【总集】C++ STL类库 vector 使用方法

    介绍: 1.vector 的中文名为向量,可以理解为一个序列容器,里面存放的是相同的数据结构类型,类似于数组但与数组又有微妙的不同. 2.vector 采用的是连续动态的空间来存储数据,它是动态的数组 ...

  6. Oracle索引梳理系列(一)- Oracle访问数据的方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  7. 访问HTML元素(节点)

    访问HTML元素等同于访问节点,能够以不同的 方式来访问HTML元素: 通过使用 getElementById() 方法 通过使用 getElementsByTagName() 方法 通过使用 get ...

  8. JS1 js获取dom元素方法

     js获取dom元素方法  1.通过ID选取元素(getElementById) 1)使用方法:document.getElementById("domId")         其 ...

  9. Struts2 访问web元素

    访问web元素的四种方法(耦合,依赖注入).(耦合,非依赖注入).(非耦合,依赖注入).(非耦合,非依赖注入) 耦合:可以得到HttpServletResponse,HttpServletReques ...

随机推荐

  1. 一个杀不死的小强,kill进程无效的原因 记录故障排查过程中kill进程无效的分析过程

    今天在处理一个机器异常负载(1000+)的问题,碰到了一个从未碰到过的情况,遇到了一个异常顽固的分子.我使用了所能想到的所有杀进程的方法,却始终无法干掉这个顽固分子,最后终于在谷歌大神的指引下,干掉了 ...

  2. linux上redis的安装与配置

    1.redis安装 wget http://download.redis.io/releases/redis-4.0.8.tar.gz tar xzf redis-4.0.8.tar.gz ln -s ...

  3. HDU 6324.Problem F. Grab The Tree-博弈(思维) (2018 Multi-University Training Contest 3 1006)

    6324.Problem F. Grab The Tree 题目看着好难,但是题解说的很简单,写出来也很简单.能想出来就是简单的,想不出来就难(讲道理,就算是1+1的题目,看不出来就是难的啊). 和后 ...

  4. 【推导】Codeforces Round #402 (Div. 2) A. Pupils Redistribution

    一次交换,会让Group A里面的某个数字的数量-1,另一个数字的数量+1:对Group B恰好相反. 于是答案就是xigma(i=1~5,numA[i]-numB[i]>0)(numA[i]- ...

  5. 【最近公共祖先】【线段树】URAL - 2109 - Tourism on Mars

    Few people know, but a long time ago a developed state existed on Mars. It consisted of n cities, nu ...

  6. 【高斯消元】【异或方程组】poj1222 EXTENDED LIGHTS OUT

    由于每个点的状态受到其自身和周围四个点的影响,所以可以这样建立异或方程组: 引用题解: http://hi.baidu.com/ofeitian/item/9899edce6dc6d3d2974452 ...

  7. 【二维树状数组】bzoj1452 [JSOI2009]Count

    权值的种类只有100种,对每种开个二维BIT,然后是经典操作. #include<cstdio> using namespace std; ][]; struct BIT_2D { ][] ...

  8. 【2-SAT(两次DFS版)】BZOJ1823-[JSOI2010]满汉全席

    [题目大意] 有n个材料,m个评委.每种材料可以被用来做满族菜或汉族菜,m个评委有两种可以让他满意的猜中.问是否可以满足所有评委要求? [思路] 每天只能做三道题,我已经是一个废人了……(葛优躺.jp ...

  9. Java多线程——ReentrantReadWriteLock源码阅读

    之前讲了<AQS源码阅读>和<ReentrantLock源码阅读>,本次将延续阅读下ReentrantReadWriteLock,建议没看过之前两篇文章的,先大概了解下,有些内 ...

  10. Scala实战高手****第10课:Scala继承彻底实战和Spark源码鉴赏

    isInstanceOf  和 asInstanceOf is用于判断 as用于转换,把父类类型转换成子类类型   getClass 具体找出类型