`
yidongkaifa
  • 浏览: 4059843 次
文章分类
社区版块
存档分类
最新评论

C++标准库 std::list 与 std::vector性能对比

 
阅读更多

list与vector分别通过链表和数组实现,所以list进行删除、插入操作时效率要比vector高出许多,而vector进行随机访问时要比list高,可是当进行顺序添加和顺序遍历时的效率两者的效率又是谁高呢?

首先分析一下,

1)对于顺序追加的操作,当vector预先分配的内存不够时,需要重新分配内存并复制对象,会对效率产生负面的影响;而list在每添加一个对象时都必须动态分配,每次动态分配内存都需要消耗系统CPU时间,这也是严重影响list效率的问题,所以list的运行效率反而可能比vector的还要低。而从另外一角度,list每个对象都必须有指向下一个对象的指针,所以每个对象都要比vector多占用至少一个指针大小的内存。

2)对于顺序遍历操作,两都应该差别不大,内为都是进行简单的指针运算。下面通过程序进行测试。

/**
* list_vs_vector.cpp
* created: 2009-10-26 11:57
* author: Noock Tian (noock.tian@gmail.com)
* A performance test program for std::list vs std::vector
*/
#include <iostream><br>#include <string><br>#include <vector><br>#include <list><br>#include <cstdlib><br>#include <ctime><br>using namespace std; </ctime></cstdlib></list></vector></string></iostream>

const char* test_data[]={
"Hello"
, "Hello C++ guys"
, "Hello C++ guys from Noock Tian"
, "Hello C++ from Noock Tian in Zheng Zhou , Henan Province, China"
, "This is a test string as a string object for performance testing between std::vector and std::list"
};

template <typename t><br>void test_add( long long repeat) <br>{ <br> cout size_t tstart = clock(), tend; <br> { <br> T v; <br> for( long long ll = 0; ll<repeat></repeat> for( int i=0; i<sizeof></sizeof> v.push_back(string(test_data[i])); <br> } <br> } <br> } </typename>

tend = clock();
cout}

volatile char null_buff[1024];

template<typename t><br>void test_sequantial_traval( long long repeat) <br>{ <br> cout T v; <br> for( int i=0; i<sizeof></sizeof> v.push_back(string(test_data[i])); <br> } <br> size_t tstart = clock(), tend; <br> for( long long ll = 0; ll<repeat></repeat> for(typename T::const_iterator it = v.begin(); it != v.end(); ++it){ <br> strcpy((char*)null_buff, it-&gt;c_str()); <br> } <br> } <br> tend = clock(); <br> cout <p>} </p> <p>int main( int argc, char* argv[]) <br>{ <br> const long long repeat = 100000; <br> cout test_add<:vector> &gt;(repeat); <br> test_sequantial_traval<:vector> &gt;(repeat); </:vector></:vector></p> <p> cout test_add<:list> &gt;(repeat); <br> test_sequantial_traval<:list> &gt;(repeat); </:list></:list></p> <p> int c; <br> cout cin&gt;&gt;c; </p> <p> return 0; <br>} </p> <p>在VS2010beta2上的结果如下:</p> <pre style="background-color: black; font-family: courier; color: white">=========vector:==========<br>Start test_add(100000)<br>Result: start = 27; end = 401; cost = 374<br>Start test_travel(100000)<br>Result: start = 438; end = 473; cost = 35 ========= list ==========<br>Start test_add(100000)<br>Result: start = 494; end = 881; cost = 387<br>Start test_travel(100000)<br>Result: start = 902; end = 940; cost = 38</pre> 在cygwin中,使用GCC 3.4.4测试结果如下: <pre style="background-color: black; font-family: courier; color: white">=========vector:==========<br>Start test_add(100000)<br>Result: start = 31; end = 2916; cost = 2885<br>Start test_travel(100000)<br>Result: start = 2916; end = 2978; cost = 62 ========= list ==========<br>Start test_add(100000)<br>Result: start = 2978; end = 5521; cost = 2543<br>Start test_travel(100000)<br>Result: start = 5521; end = 5584; cost = 63</pre> 结果显示,在只进行顺序添加和顺序遍历的情况下两者运行效率相当,其效率与编译器与其标准库的实现有关系,但list将占用更多的内存,而且可能造成更多的内存碎片,所以使用vector是更好的选择。 </typename>

分享到:
评论

相关推荐

    【STL源代码】C++标准库STL源代码下载

    【STL源代码】中包含了许多常用的数据结构(如vector、list、map等)和算法(如排序、查找、遍历等)。通过阅读代码可以仔细研究这些数据结构和算法的实现,了解它们的内部工作原理和使用方式。

    myostream:方便的输出,适用于所有可迭代项目的容器类型

    C ++标准要求:&gt; = C ++ 11 支持的容器或类似容器的类型: std :: pair std :: tuple std :: array std :: deque std :: forward_list std :: initializer_list std :: list std :: vector std :: set std :: ...

    C++标准库(第二版)英文版.pdf

    C++标准库(第二版)英文版.pdf 非扫描版+源代码 Prefaceto the SecondEdition xxiii Acknowledgments for the SecondEdition xxiv Prefaceto the FirstEdition xxv Acknowledgments for the FirstEdition xxvi 1 ...

    DonerSerializer:一个C ++ 14 JSON序列化库

    一个C ++ 14仅限标头的库,用于将您的类数据序列化为JSON DonerSerializer是一个C ++ 14仅限标头... std::vector std::list std::map std::unordered_map 正在下载 您可以获得稳定的发行版。 或者,您可以通过以下

    C++中的vector容器对象学习笔记

    和 string 对象一样,标准库将负责管理与存储元素相关的内存。 我们把 vector 称为容器,是因为它可以包含其他对象 。 一个容器中的所有对象都必须是同一种类型的 。 vector对象的定义和初始化 同样的,使用前,导入...

    lemonxx:Lemon解析器生成器,具有更好的c ++ 11支持

    )人为的例子###柠檬 - %token_type {std::any} // c++17%type number_list{std::vector&lt;int&gt;}%type string_list{std::vector&lt;std&gt;}// or use a std::shared_ptr or std::unique_ptr...program ::= list.list ::=...

    harmonyos2-harmony:C++单体学

    std::list&lt;T&gt;... etc ) Either ( Result ) 之类的类型 任何程序定义的可以识别 monad 的类型 例子 # include &lt; iostream &gt; # include &lt; optional &gt; // Main header of this library # include " harmony.hpp ...

    42_ft_containers:重新编码标准

    42_ft_containers 重新编码std :: list,std :: vector,std :: map,std :: stack和std :: queue,而无需单独调用stl作为42Paris编码学校的项目。 要调用它,请使用命名空间ft ::而不是std ::,如下所示: ft::list...

    C++标准程序库STL的架构

    5 STL标准程序库 16 5.1 STL组件 16 5.1.1 分类 16 5.1.2 基本观念 16 5.1.3 好处 16 5.2 容器(containers) 16 5.2.1 分类 16 5.2.2 序列式容器示例 16 5.2.3 关联式容器 18 5.3 迭代器 18 5.3.1 示例 19 5.3.2 ...

    CTL是ISO C11的一种快速编译,类型安全,仅标头的,类似于模板的库。-C/C++开发

    动机CTL旨在通过在ISO C11中实现以下STL容器来提高C11开发人员的生产率:deq.h = std :: deque lst.h = std :: list pqu.h = std :: priority_queue que.h = std :: queue set.h = std :: set stk.h = std :: stack ...

    STL 源码剖析(侯捷先生译著)

    1.1.2 STL与C++ 标准程序库 003 . 1.2 STL 六大组件 - 功能与运用 004 1.3 GNU源码开放精神 007 1.4 HP STL实现版本 009 1.5 P.J. Plauger STL实现版本 010 1.6 Rouge Wave STL实现版本 011 1.7 STLport 实现...

    c++11&14-STL要点汇总

    在c++里面不得不提的一个标准库,就是STL,STL包含很多实用的数据结构,如vector,list,map,set等都是我们常用的,而c++11也对STL做了一些补充,使得STL的内容越来越丰富,可选择的也越来越多了。 1. std::array 先看...

    C++编写非侵入式接口

    支持泛型,好比vector,list;支持继承,基类实现的接口,表示子类也继承了对该接口的实现,而且子类也可以拒绝基类的接口,好比鸭子拒绝基类鸟类“会飞”,编译时报错;支持接口组合;……,但是,这里仅仅简单介绍...

    c-plus-plus-serializer:最小的C ++ 11仅标头序列化器。 可以序列化基本类型,字符串,容器,映射和自定义类。 指针类型尚无支持

    简单的C ++ 11仅标头序列化器 您是否曾经想要过一个非常小的仅标头C ++ 11序列化器? 当然有! 尝试了其他一些实现后,当它们不可避免地无法... std :: vector std :: list std :: array(也适用于多维) std :: map

    c/c++函数库说明(api)html版

    所有的 C / C++ 函数 Constructors (cppstring) Constructors (cppvector) Operators (cppbitset) Operators (cppdeque) Operators (cppstack) Operators (cppstring) Operators (cppvector) abort (stdother...

    ExtendedVector:C ++ 17版本的标准

    该项目的目标是创建一个工具,该工具将使对标准的std::vector变得更加容易,因为它涉及对集合进行的复杂但典型的操作,这些操作当前不是向量头的一部分,但是需要更多包含和更多LOC。 请查看和的官方文档,以了解...

    SharpVector:C ++ 17版本的标准

    该项目的目标是创建一个工具,该工具将使对标准的std::vector变得更加容易,因为它涉及对集合进行的复杂但典型的操作,这些操作当前不是向量头的一部分,但是需要更多包含和更多LOC。 请查看和的官方文档,以了解此...

    ReflectionPOC:适用于C ++的概念验证的编译时反射API

    检查清单支持Archive.h支持杰森支持Sol2 / Lua支持struct_pack UI绑定支持可以递归遍历类,嵌套结构)支持继承支持标准容器std :: vector std :: deque std :: list std :: set std :: multiset std :: map std :: ...

    C和C++头文件对比一览

    更本质上的区别就是iostream把标准C++库的组件放在一个名位std的namespace里面。而相对的iostream.h则将这些标准组件放在全局空间里,同时在标准化以后旧有的C标准库也已经经过改造了。 看看下面这两个头文件 ...

    Arduino-List:实现动态数组的Arduino库

    更多信息使用说明List类的操作与C ++中的Vector类相似,但是其实现方式很简单,可以在像Arduino这样的处理器中使用。 但是,方法和变量的名称类似于C#中可用的通用List类,它更为现代和最新。 List类被初始化为...

Global site tag (gtag.js) - Google Analytics