遍历一个vector容器有非常多种方法。使用起来也是仁者见仁。
通过索引遍历:
for (i = 0; i
迭代器遍历:
for (vInt::const_iterator iter = v.begin(); iter != v.end();iter++){ cout << *iter << " ";}
算法遍历:
copy(v.begin(), v.end(), ostream_iterator (cout, " "));
非常多书上推荐的是使用算法进行遍历。
写了一个简单的程序对上面的三种方法进行了比較:
#include#include #include #include #include #include using namespace std;typedef vector vInt;void print_vec_operator(const vInt & v)//方法一,採用下标訪问{ int i; for (i = 0; i
当vector初始化10000个元素时,三种方法的效率不相上下。执行几次时间相差无几:
//输出: //1718 operator[] //1735 iterator //1797 algorithm可是当把veector初始化100000的时候,三种方法的效率就有了较大的差距:
//输出: //20016 operator[] //32172 iterator //62468 algorithm再写一个vector里放一个类:
#include#include #include #include #include #include class AAA{public: void MakeFull2() { }};int main(){ int nCount = 1000000; std::vector< AAA* > vAAA; vAAA.resize(nCount); for (int i = 0; i < nCount; ++i) { vAAA[i] = new AAA; } // 时间 int start, end; // 測试成员函数调用(std::vector下标訪问方式) start = GetTickCount(); size_t count = vAAA.size(); for (size_t i = 0; i < count; ++i) vAAA[i]->MakeFull2(); end = GetTickCount(); std::cout << end - start << std::endl; // 測试成员函数调用(STL算法方式) start = GetTickCount(); std::for_each(vAAA.begin(), vAAA.end(), std::mem_fun (&AAA::MakeFull2)); end = GetTickCount(); std::cout << end - start << std::endl; // 測试成员函数调用(STL迭代器方式) start = GetTickCount(); std::vector< AAA* >::iterator itr_end = vAAA.end(); for (std::vector< AAA* >::iterator itr = vAAA.begin(); itr != itr_end; ++itr) (*itr)->MakeFull2(); end = GetTickCount(); std::cout << end - start << std::endl; // 測试成员函数调用(STL迭代器方式) start = GetTickCount(); for (std::vector< AAA* >::iterator itr = vAAA.begin(); itr != vAAA.end(); ++itr) (*itr)->MakeFull2(); end = GetTickCount(); std::cout << end - start << std::endl; return 0;}//输出://313 oprator[]//62 algorithm//422 iterator//922 iterator
再执行一次,结果为:
//296 //63 //594 //1672这个时候使用algorithm+functional进行遍历效率最高。
个人认为下标索引的方式总是会效率高于迭代器方式。
以下分析一下两种迭代器方式。为何相差不小呢:
这就要看一下std::vector::end()的原型了:
iterator end() _NOEXCEPT{ // return iterator for end of mutable sequence return (iterator(this->_Mylast(), &this->_Get_data()));}
就是每次推断itr != vAAA.end()的时候,都要进行又一次构造一个迭代器并进行返回。这样当然减少的效率。