访问vector元素方法的效率比较(转)

vs2015中测试:

 1 #include<iostream>
 2 #include<vector>
 3 #include<windows.h>
 4 using namespace std;
 5
 6
 7
 8 int main() {
 9     //建立4个vector,使用列表初始化,相当与调用拷贝构造函数
10     vector<int> v1;
11     int temp;
12     int i;
13     for (i = 0; i < 100000; ++i) {
14         v1.push_back(i);
15     }
16     //测试1
17     DWORD start,end;
18     start= GetTickCount();
19     for (i = 0; i < v1.size(); ++i) {
20         temp=v1[i];
21     }
22     end = GetTickCount();
23     cout << "使用[]运算符耗时:" << end - start << "ms" << endl;
24     //测试2
25     start = GetTickCount();
26     for (auto k = v1.begin(); k < v1.end(); ++k)
27     {
28         temp = *k;
29     }
30     end = GetTickCount();
31     cout << "使用迭代器(++k)耗时:" << end - start << "ms" << endl;
32
33     //测试3
34     start = GetTickCount();
35
36     for (auto k = v1.begin(); k < v1.end(); k++)
37     {
38         temp = *k;
39     }
40     end = GetTickCount();
41     cout << "使用迭代器,使用k++,而不是++k:" << end - start << "ms" << endl;
42
43     //测试4
44     start = GetTickCount();
45     i = 0;
46     for (auto k = v1.begin(); i<v1.size(); ++i,++k)
47     {
48         temp = *k;
49     }
50     end = GetTickCount();
51     cout << "使用迭代器,不使用end()方法:" << end - start << "ms" << endl;
52
53
54
55
56     system("pause");
57     return 0;
58 }

输出: 

OK,从分析结果:

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

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

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

时间: 2024-08-05 06:48:45

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

StrBlobPtr类——weak_ptr访问vector元素

#include <iostream> #include <memory> #include <string> #include <initializer_list> #include <vector> #include <stdexcept> using namespace std; class StrBlobPtr; class StrBlob { friend class StrBlobPtr; public: using si

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

来源:http://www.jb51.net/article/44231.htm 作者: 字体:[增加 减小] 类型:转载 时间:2013-12-08我要评论 vector是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器,本文介绍一下使用方法 vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.vector 是C++ STL的一个重要成员,使用它时需要包含头文件: 复制代码 代码如下: #include<vector>; 一.vector 的初始

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position); //删除指定元素 iterator erase (iterator first, iterator last); //删除指定范围内的元素 返回值:指向删除元素(或

struts2 访问Web元素的4种方法

完整代码 :Struts12AccessWebElement.rar 第一种也是最常用的一种方法实现这几个接口 RequestAware,SessionAware,ApplicationAware struts以依赖注入方式把request,session和application赋上值,看一下完整的代码 package com.pengli.struts.parampack; import java.util.Map; import org.apache.struts2.interceptor.

DOM访问HTML元素的方式,DOM访问表单控件的常用属性和方法,DOM访问列表框、下拉菜单的常用属性,DOM访问表格子元素的常用属性和方法,DOM对HTML元素的增删改操作

DOM访问HTML元素的方式 为了动态地修改HTML元素,须先访问HTML元素.DOM主要提供了两种方式来访问HTML元素: 根据ID访问HTML元素:通过document对象调用getElementById()方法来查找具有唯一id属性值的元素. 利用节点关系访问HTML元素.常用的属性和方法如下: parentNode 返回当前节点的父节点 previousSibling 返回当前节点的前一个兄弟节点 nextSibling 返回当前节点的后一个兄弟节点 childNodes 返回当前节点的

C/C++中容器vector使用方法&lt;第二弹&gt;

此文总结常用vector操作,是前一篇的续作!只有代码,详细请看代码中的注释.出于反爬虫的目的,你不是在http://blog.csdn.net/zhanh1218上看到的,肯定不是最新最全的. /********************************************************************* * file_name: vector_test.cpp * * Created on: 2014年6月28日 下午3:34:23 * Author: The_T

C++Vector使用方法

C++内置的数组支持容器的机制,可是它不支持容器抽象的语义.要解决此问题我们自己实现这种类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用须要的头文件:#include <vector>.vector 是一个类模板.不是一种数据类型,vector<int>是一种数据类型.Vector的存储空间是连续的,list不是连续存储的. 一. 定义和初始化vector< typeName > v1;       //默认v1为空

C/C++中容器vector使用方法

C++中数组很坑,有没有类似Python中list的数据类型呢?类似的就是vector!vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和 string 对象一样,标准库将负责管理与存储元素相关的内存.我们把 vector 称为容器,是因为它可以包含其他对象.一个容器中的所有对象都必须是同一种类型的. vector对象的定义和初始化 同样的,使用前,导入头文件#include <vector> 可以使用using声明:using std::vector; vector

Struts2学习之路(五)—— 访问web元素

以下是Action类中访问web元素的示例,共有四种方法.其中第一种和第三种依赖容器,第二种和第四种利用IOC思想.前面两种取得Map类型的request.session.application:后面两种是真实类型HttpServletRequest.HttpServletSession.ServletContext的引用. 1.第一种方法: 1 package com.user.action; 2 3 import java.util.Map; 4 5 import com.opensymph