相信每一个C++程序员都使用过STL库的vector,那么遍历一个vector有那些方法呢?哪个遍历的速度最快。
第一种,使用迭代器的方法访问。
for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it)
{ /* std::cout << *it; ... */}
第二种,是用数组下标进行访问
for(std::vector<int>::size_type i = 0; i != v.size(); i++)
{ /* std::cout << v[i]; ... */}
第三种,使用auto,这个需要C++11才支持。
for(auto const& value: a) { /* std::cout << value; ... */}
第四种,使用for each, 这个需要C++17才能够支持
std::for_each(std::par_unseq, a.cbegin(), a.cend(), [](const auto& e) { /* do stuff... */ });
那么,这四种当中,究竟哪一个速度最快呢?答案是第三第四种,因为求v.size()跟v.end()实际上也是需要一定时间的,而auto冒号写法的底层实现已经把这个数据预处理了。
{
auto && __range = range_expression ;
auto __begin = begin_expr ;
auto __end = end_expr ;
for ( ; __begin != __end; ++__begin)
{ range_declaration = *__begin; loop_statement }
}
事实上,这几种方法的速度相差并没有多少,对于业务开发来说,代码的简洁跟封装才是更加重要的。所以,在C++11以上的版本,更推荐使用第三种写法,如果取出数据还需要进行某些操作,推荐使用第四种写法。
网友评论