遍历vector容器的效率问题

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:  今天看到关于vector遍历效率问题,以前遍历的时候却没有关心这些,实为惭愧。自己写了点代码放在vs2012上运行,得到结果和原来的博客上内容不符合。看来应该还有与平台和编译器优化有关。       代码如下: #include "stdafx.h"#include <vector>#include <algorithm>#include <f

 今天看到关于vector遍历效率问题,以前遍历的时候却没有关心这些,实为惭愧。自己写了点代码放在vs2012上运行,得到结果和原来的博客上内容不符合。看来应该还有与平台和编译器优化有关。

      代码如下:

#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>



int _tmain(int argc, _TCHAR* argv[])
{
	class CTest
	{
	public:
		void add(){}
	};

	typedef std::vector<CTest*> VEC;
	VEC::size_type nAmount = 1000000;
	std::vector<CTest*>  vec;
	vec.resize(nAmount);
	for (VEC::size_type i = 0; i < nAmount; ++i)
	{
		vec[i] = new CTest();
	}

	DWORD dwStart, dwEnd;

	// STL -- for_each
	dwStart = timeGetTime();
	std::for_each(vec.begin(), vec.end(), std::mem_fun<void, CTest>(&CTest::add));
	dwEnd	= timeGetTime();
	std::cout << "for_each:\t" << dwEnd - dwStart << std::endl;

	// STL -- iterator
	dwStart = timeGetTime();
	std::vector<CTest*>::iterator itr_begin = vec.begin();
	std::vector<CTest*>::iterator itr_end = vec.end();
	for (; itr_begin != itr_end; ++itr_begin)
	{
		(*itr_begin)->add();
	}
	dwEnd	= timeGetTime();
	std::cout << "iterator:\t" << dwEnd - dwStart << std::endl;

	// STL -- iterator2
	dwStart = timeGetTime();
	std::vector<CTest*>::iterator itr_begin2 = vec.begin();
	for (; itr_begin2 != vec.end(); ++itr_begin2)
	{
		(*itr_begin2)->add();
	}
	dwEnd	= timeGetTime();
	std::cout << "iterator:\t" << dwEnd - dwStart << std::endl;

	// operator[]
	dwStart = timeGetTime();
	for (size_t i = 0; i < nAmount; ++i)
	{
		vec[i]->add();
	}
	dwEnd	= timeGetTime();
	std::cout << "operator:\t" << dwEnd - dwStart << std::endl;

	system("pause");
	return 0;
}

测试多次,结果相差不大,截图三张:


 结果表明,使用迭代器效果最差,使用STL算法和下标方式差不多。


1、for_each (vs2012版)

template<class _InIt,
	class _Fn1> inline
	_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
	{	// perform function for each element
	_DEBUG_RANGE(_First, _Last);
	_DEBUG_POINTER(_Func);
	_For_each(_Unchecked(_First), _Unchecked(_Last), _Func);


	return (_STD move(_Func));
	}

2、end() (vs2012版)

iterator end() _NOEXCEPT
		{	// return iterator for end of mutable sequence
		return (iterator(this->_Mylast, this));
		}

3、operator[] (vs2012版)

const_reference operator[](size_type _Pos) const
		{	// subscript nonmutable sequence
 #if _ITERATOR_DEBUG_LEVEL == 2
		if (size() <= _Pos)
			{	// report error
			_DEBUG_ERROR("vector subscript out of range");
			_SCL_SECURE_OUT_OF_RANGE;
			}

 #elif _ITERATOR_DEBUG_LEVEL == 1
		_SCL_SECURE_VALIDATE_RANGE(_Pos < size());
 #endif /* _ITERATOR_DEBUG_LEVEL */

		return (*(this->_Myfirst + _Pos));
		}

特别的注意点是end(),每次调用end()就重新构建一个对象。第三种方法几乎是第二种的两倍。


===================================================

mem_fun和mem_fun_ref

前者处理容器中为指针类型,后者为类类型。




相关文章
|
4月前
|
存储 C++ 容器
如何将没有复制或移动构造函数的对象放入vector容器
如何将没有复制或移动构造函数的对象放入vector容器
42 0
|
3月前
|
XML 移动开发 JSON
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
本文介绍了Twaver HTML5中的数据容器(DataBox),包括如何进行增删查改操作、遍历数据容器以及判断网元是否存在于数据容器中。DataBox用于管理所有的网元对象,如ElementBox、LayerBox、AlarmBox等,并通过示例代码展示了其常用方法的使用。
47 1
Twaver-HTML5基础学习(18)数据容器(1)_增删查改、遍历数据容器、包含网元判断
|
6月前
|
C++ 容器
C++之评委打分案例(vector与deque容器练习)
C++之评委打分案例(vector与deque容器练习)
|
6月前
|
存储 算法 C++
C++一分钟之-容器概览:vector, list, deque
【6月更文挑战第21天】STL中的`vector`是动态数组,适合随机访问,但插入删除非末尾元素较慢;`list`是双向链表,插入删除快但随机访问效率低;`deque`结合两者优点,支持快速双端操作。选择容器要考虑操作频率、内存占用和性能需求。注意预分配容量以减少`vector`的内存重分配,使用迭代器而非索引操作`list`,并利用`deque`的两端优势。理解容器内部机制和应用场景是优化C++程序的关键。
72 5
|
6月前
|
存储 算法 C++
【C++/STL】:vector容器的基本使用
【C++/STL】:vector容器的基本使用
42 1
|
5月前
|
存储 安全 C++
|
5月前
|
存储 算法 C++
【C++】详解STL容器之一的 vector
【C++】详解STL容器之一的 vector
|
6月前
|
算法 C++ 容器
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
C++之vector容器操作(构造、赋值、扩容、插入、删除、交换、预留空间、遍历)
269 0
|
6月前
|
算法 编译器 Linux
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
【C++/STL】:vector容器的底层剖析&&迭代器失效&&隐藏的浅拷贝
51 0
|
6月前
|
存储 缓存 C++
Vector容器介绍
Vector容器介绍