STL之效率比较

1、vector

变长一维数组,连续存放的内存块,有保留内存,堆中分配内存;

支持[]操作,高效率的随机访问;

在最后增加元素时,一般不需要分配内存空间,速度快;在中间或开始操作元素时要进行内存拷贝效率低;

vector高效的原因在于配置了比其所容纳的元素更多的内存,内存重新配置会花很多时间;

注:需要高效的随即存取,而不在乎插入和删除使用vector。

2、list

双向链表,内存空间上可能是不连续的,无保留内存,堆中分配内存;

不支持随机存取,开始和结尾元素的访问时间快,其它元素都O(n);

在任何位置安插和删除元素速度都比较快,安插和删除操作不会使其他元素的各个pointer,reference,iterator失效;

注:大量的插入和删除,而不关系随即存取使用list。

3、deque

双端队列,在堆上分配内存,一个堆保存几个元素,而堆之间使用指针连接;

支持[]操作,在首端和末端插入和删除元素比较快,在中部插入和删除则比较慢,像是list和vector的结合;

注:关心插入和删除并关心随即存取折中使用deque。

4、set&multiset

有序集合,使用平衡二叉树存储,按照给定的排序规则(默认按less排序)对set中的数据进行排序;

set中不允许有重复元素,multiset中运行有重复元素;

两者不支持直接存取元素的操作;

因为是自动排序,查找元素速度比较快;

不能直接改变元素值,否则会打乱原本正确的顺序,必须先下删除旧元素,再插入新的元素。

5、map&multimap

字典库,一个值映射成另一个值,使用平衡二叉树存储,按照给定的排序规则对map中的key值进行排序;

map中的key值不允许重复,multimap中的key允许重复;

根据已知的key值查找元素比较快;

插入和删除操作比较慢。

STL之效率比较

时间: 2024-10-19 09:38:17

STL之效率比较的相关文章

STL之效率比較

1.vector 变长一维数组,连续存放的内存块,有保留内存.堆中分配内存: 支持[]操作,高效率的随机訪问: 在最后添加元素时,一般不须要分配内存空间,速度快:在中间或開始操作元素时要进行内存拷贝效率低: vector高效的原因在于配置了比其所容纳的元素很多其它的内存,内存又一次配置会花非常多时间. 注:须要高效的随即存取,而不在乎插入和删除使用vector. 2.list 双向链表,内存空间上可能是不连续的,无保留内存.堆中分配内存: 不支持随机存取.開始和结尾元素的訪问时间快,其他元素都O

STL之deque容器的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector底层采用的是一个数组来实现,list底层采用的是一个环形的双向链表实现,而deque则采用的是两者相结合,所谓结合,并不是两种数据结构的结合,而是某些性能上的结合.我们知道,vector支持随机访问,而list支持常量时间的删除,deque支持的是随机访问以及首尾元素的删除. deque是double ended queue的缩写,读作deck.首先我们用一个图来说明deque底层所采用的数据结构. 这个数据结构有一种似曾相识的感觉

STL源码分析——sort排序

稍微花了一点点时间看了一下老师推荐的博客:http://feihu.me/blog/2014/sgi-std-sort/,看完后无不赞叹STL追求效率之极致,STL的sort排序算法综合了三种排序快排,堆排和插入排序,被称为Introspective Sort(内省式排序),在算法内部根据自身不同的情形来判断来使用不同的算法进行排序,sort算法可以说综合了三种排序算法的优点,追求效率到了极致. 一开始sort算法有两部分组成,__introsort_loop和__final_insertion

在win7 + vs express for desktop中安装stlport和boost库

一.安装stlport stlport是将sgi的stl库平移到各个平台上.sgi的这个库的特点就是效率非常高.boost在这个库上面运行要比vs自带的stl库效率高.所以我们首选安装stlport. 下载stlport:http://sourceforge.net/projects/stlport/ 最新版本是5.2.1 放到C盘根目录下面,解压.进入"vs2012 x86 native tools command prompt".(注意:用cmd不行) 进入"C:\STL

iterator 前++ 后++区别

for(iterator it = begin(); it != end(); ++it)  此处的 begin()<==>this->begin()       或者for(iterator it = begin(); it != end(); it++)        区别是什么呢?? 对于两种方式来说:for(iterator it = begin(); it != end(); ++it){     return it->second;}for(iterator it =

对象序列化之Boost.Serialization

最近在写基于海量点云数据建模程序时,碰到一个效率问题:整个建模过程是管道线方式,这里简单地看作是两步,第一步就是生成所需的数据,第二步即是基于这些生成的数据建模:目前所做的工作就是写第二步,第一步的操作不需要变动,这就造成每次对第二步进行修改(再编译链接后执行)后,重新生成所需数据,而这个生成过程是相当缓慢的,从而给开发调试阶段造成极大的时间浪费. 于是就想到了对象序列化,而对象序列化有好几种方案,常用的有Google Protocol Buffers(protobuf).Boost.Seria

C#下内存管理--垃圾收集

章节安排 内存管理简介 垃圾回收机制 性能问题 C#下非托管资源的处理 要强调的几点 References 内存管理简介 对于任何一种编程语言,内存管理都是不得不提很重要的一块内容,但可惜的是目前为止没有任何一种编程语言对内存管理处理的非常完美,每种语言都在兼顾性能 效率,语法语义易用性等方面折中中有所侧重.例如较之于C#,JAVA等语言C++号称不需要垃圾收集,因为C++本身产生的垃圾很少,诚然这是C++的 优势,这也就是为什么在内存受限或者效率优先的环境下优先考虑C++,但它的缺点也是明显的

[转] C++11带来的move语义

PS: 通过引入接收右值的函数形参,可以通过接收右值来实现高效 C++ 11带来了move语义,可以有效的提高STL的效率,这篇文章写的非常好,可以参考,这里对原文进行翻译,加入我自己的理解 原文:http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html 先看看这个例子: [cpp] view plaincopy #include <iostream> using namespace

C语言实现通用数据结构的高效设计

最近在阅读一个开源的C++代码,里面用到了大量的STL里面的东西.也许是自己一直用C而很少用C++来实现算法的原因,STL里面大量的模板令人心烦.一直对STL的效率表示怀疑,但在网上搜到这样一个帖子,说C的标准库里面快速排序比STL的标准排序要慢!于是,便认真的看了下二者的源码.其实两个使用的算法是完全类似的,而C标准库里面的qsort之所以比std::sort慢,是因为C语言中为了适配所有的数据结构使用了空指针.下面以更为简单的插入排序为例说明这个问题. 插入排序的算法实现代码: void i