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. 更换介质:请把标有…… DVD 的盘片插入驱动器“/media/cdrom/”再按回车键“ 解决方法

    https://blog.csdn.net/no7oor/article/details/12776815

  2. [BZOJ3027][Ceoi2004]Sweet 容斥+组合数

    3027: [Ceoi2004]Sweet Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 135  Solved: 66[Submit][Status] ...

  3. c#实现Form窗体始终在桌面最前端显示

    方法一 //调用API [System.Runtime.InteropServices.DllImport("user32", CharSet = System.Runtime.I ...

  4. (12)python 标准库

    模块 如果模块和自己写的程序不在同一个目录,可以通过sys.path.append(路径)把程序引入 import sys sys.path.append('C:/abc')#注意 \ 的方向 意思是 ...

  5. boost::operators

    boost 的 operators 提供了comparison operators.arithmetic operators.operators for iterators 操作.虽然使用 C++ 的 ...

  6. pthread条件变量

    pthread条件变量等待条件有两种方式:无条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait(),其中计时等待方式如果在给定时刻前条件没有满足,则返 ...

  7. centos7下ip转发的配置

    1.先确认ipv4配置了转发设置 vim /etc/sysctl.conf                    #命令1(编辑配置文件) net.ipv4.ip_forward=1          ...

  8. POJ 3622 Gourmet Grazers(贪心)

    [题目链接] http://poj.org/problem?id=3622 [题目大意] 给出一些物品拥有两个属性值,价格和精美程度 给出一些需求表示要求获得的物品两个属性值的两种属性下界, 一个物品 ...

  9. python操作mysql封装成类

    import pymysqlimport loggingimport sys # 加入日志#获取logger实例logger = logging.getLogger("baseSpider& ...

  10. Java高级架构师(一)第01节:整体课程概览

    本课程专注于构建:高可扩展性.高性能.大数据量.高并发.分布式的系统架构. 从零开始.全面系统.成体系的软件架构课程,循序渐进的讲述构建上述系统架构所需要的各种技术知识和技能. 适应人群: 1:有一定 ...