`

STL中容器的比较

 
阅读更多
在STL中基本容器有string vector list deque set map

set map都是无序的保存元素只能通过它提供的接口对里面的元素进行访问

set 集合, 用来判断某一个元素是不是在一个组里面使用的比较少
map 映射相当于字典把一个值映射成另一个值如果想创建字典的话使用它好了

string vector list deque set 是有序容器
string 是basic_string的实现,
在内存中是连续存放的为了提高效率,都会有保留内存,如string s= "abcd",这时s使用的空间可能就是255, 当string再次往s里面添加内容时不会再次分配内存直到内容>255刊才会再次申请内存因此提高了它的性能当内容>255时string 会先分配一个新内存然后再把内容复制过去再复制先前的内容

对string的操作如果是添加到最后时一般不需要分配内存所以性能最快如果是对中间或是开始部分操作如往那里添加元素或是删除元素或是代替元素这时需要进行内存复制性能会降低

如果删除元素string一般不会释放它已经分配的内存为了是下次使用时可以更高效

由于string会有预保留内存所以如果大量使用的话会有内存浪费这点需要考虑还有就是删除元素时不释放过多的内存这也要考虑

string中内存是在堆中分配的所以串的长度可以很大而char[] 是在栈中分配的长度受到可使用的最大栈长度限制

如果对知道要使用的字符串的最大长度那么可以使用普通的char[] 实现而不必使用string
string用在串长度不可知的情况或是变化很大的情况

如果string已经经历了多次添加删除现在的尺寸比最大的尺寸要小很多想减少string使用的大小可以使用
string s = "abcdefg";
string y(s); //因为再次分配内存时y只会分配与s中内容大一点的内存所以浪费不会很大
s.swap(y);//减少s使用的内存

如果内存够多的话就不用考虑这个了


capacity是查看现在使用内存的函数大家可以试试看string分配一个一串后的capacity返回值还有其它操作后的返回值

vector
vector就是动态数组它也是在堆中分配内存元素连续存放有保留内存如果减少大小后央存也不会释放如果新值.当前大小时才会再分配内存对最后元素操作最快(在后面添加删除最快) 此时一般不需要移动内存只有保留内存不够时才需要对中间和开始处进行添加删除元素操作需要移动内存如果你的元素是结构或是类那么移动的同时还会进行构造和析构操作所以性能不高

访问方面对任何元素的访问都是O(1) 也就是是常数的所以vector常用来保存需要经常进行随机访问的内容并且不需要经常对中间元素进行添加删除操作
相比较可以看到vector的属性与string差不多同样可以使用capacity看当前保留的内存使用swap来减少它使用的内存

总结:
需要经常随机访问请用vector


list
list就是链表元素也是在堆中存放每个元素都是放在一块内存中

list没有空间预留习惯所以每分配一个元素都会从内存中分配每删除一个元素都会释放它占用的内存,这与上面不同可要看好了

list在哪里添加删除元素性能都很高不需要移动内存当然也不需要对每个元素都进行构造与析构了所以常用来做随机操作容器但是访问list里面的元素时就开始和最后访问最快访问其它元素都是O(n) 所以如果需要经常随机访问的话还是使用其它的好

总结:如果你喜欢经常添加删除大对象的话那么请使用list
要保存的对象不大构造与析构操作不复杂那么可以使用vector代替
list<指针> 完全是性能最低的做法这种情况下还是使用vector<指针>好因为指针没有构造与析构也不占用很大内存

deque
双端队列

也是在堆中保存内容的

它的保存形式如下

[堆1]
... ...
[堆2]
... ...
[堆三]

每个堆保存好几个元素然后堆和堆之间有指针指向

看起来像是listvector的结合品不过确实也是如此

deque的让你可以在前面快速的添加删除元素或是在后面快速的添加删除元素然后还可以比较高的随机访问速度

vector是可以快速的在最后添加删除元素并可以快速的访问任意元素
list是可以快速的在所有地方添加删除元素但是只能快速的访问最开始与最后的元素
deque在开始和最后添加元素都一样快并提供了随机访问方法像vector一样使用[]访问任意元素但是随机访问速度比不上vector快因为它要内部处理堆跳转
deque也有保留空间另外由于deque不要求连续空间所以可以保存的元素比vector更大这点也要注意一下还有就是在前面和后面添加元素时都不需要移动其它块的元素所以性能也很高
分享到:
评论

相关推荐

    C++实战篇:STL-容器

    C++实战篇:STL-容器 C++实战篇:STL-容器 C++实战篇:STL-容器 C++实战篇:STL-容器 C++实战篇:STL-容器 C++实战篇:STL-容器 C++实战篇:STL-容器 C++实战篇:STL-容器 C++实战篇:STL-容器 C++实战篇:STL-容器 ...

    C++ STL vector 容器介绍

    学习`vector`容器时,还需要理解其与其他STL容器如`deque`、`list`和`array`的区别,以便在不同的场景下选择最合适的容器。例如,`deque`在两端插入和删除更高效,`list`则适合频繁的插入和删除,而`array`是固定...

    STL关联容器入门

    STL关联容器入门

    c++/STL容器设计相关

    本节将深入探讨STL容器的设计与使用,包括其基本概念、类型、操作以及在实际编程中的应用。 一、STL容器概述 STL容器是一种对象,它们可以存储、管理和操作其他对象。STL提供了多种不同类型的容器,如向量(vector...

    基于stl共享内存,可以像使用STL容器一样使用共享内存

    在标题和描述中提到的"基于stl共享内存,可以像使用STL容器一样使用共享内存",指的是通过设计一个自定义的内存分配器(Allocator),使得STL容器如vector、list、map等能够在共享内存上进行操作。这种方式的优势...

    STL -容器,string容器

    在STL容器中,string容器是最常用的容器之一。string容器的实现是基于vector容器的,可以看作是一个特殊的vector容器。string容器的优点是可以自动管理内存,避免了手动管理内存的麻烦。 STL容器的优点是提供了高效...

    STL中容器算法使用说明大全

    8. **迭代器**:迭代器是STL的核心概念,它像指针一样遍历容器中的元素,但提供了更多操作,如增加、减少、比较和解引用。 9. **函数对象(functors)**:STL允许使用自定义的函数对象(如比较函数)来定制容器和...

    STL容器使用代码

    STL(Standard Template Library,标准模板库)是C++编程语言中的一个重要组成部分,它提供了高效且灵活的数据结构和算法。在STL中,容器是一类能够...通过学习这些代码,你可以更好地理解STL容器的API和实际操作方式。

    STL的容器deque的使用

    **STL中的deque容器详解** `deque`(双端队列)是C++标准模板库(STL)中的一种重要容器,它提供了类似数组的功能,同时支持在两端进行高效插入和删除操作。与vector相比,deque在两端操作时通常具有更好的性能,...

    stl_set容器详细使用方法

    Set 容器提供了多种比较函数体,用于比较容器中的元素。 * `key_comp()`:获取容器的键比较函数体。 * `value_comp()`:获取容器的值比较函数体。 其他操作函数 Set 容器提供了多种其他操作函数,用于执行各种...

    STL容器.emmx

    STL容器,用思维导图的方式表达了一下,其中一些所有容器都通用的函数没有列举如a.size(),a.capacity()等。。希望对各位有帮助.

    STL容器和算法函数表

    ### STL容器和算法函数表详解 #### 一、Vector类的主要成员 `vector&lt;T&gt;`是C++标准模板库(STL)中的动态数组实现,能够自动调整其大小,提供了高效的随机访问能力,是C++中最常用的数据结构之一。 ##### 容器属性 -...

    gdb中查看stl容器命令封装脚本

    在复杂的程序中,尤其是当涉及到STL容器时,有效地查看和理解这些容器的状态是调试的关键。本文将详细介绍如何使用GDB来查看STL容器,并特别关注一个名为"gdbinit"的脚本,它能够帮助我们封装这些命令,提高调试效率...

    STL 容器对比

    stl中容器的比较,能对所学的容器有一个很好的认知和对比

    STL顺序容器:list的使用

    与另一种常见的STL容器向量(vector)相比,list的主要特点在于它的操作特性。 1. 插入和删除效率高:由于list的元素不是连续存储的,所以在任何位置插入或删除元素时,只需要修改相邻元素的指针即可,时间复杂度为...

    STL 应用例子 包括各容器的使用

    STL的核心是迭代器,它提供了对容器中元素的访问。迭代器的行为类似于指针,但提供了更丰富的操作,如前移、后移、读取和修改元素等。 4. **函数对象(Functors)**: "functor"文件可能包含自定义的函数对象,这...

    STL中文手册 doc文档

    4. 函数对象:函数对象是一种可以像函数一样调用的对象,通常用于对容器中的元素进行特定操作。它们可以是简单的函数指针,也可以是复杂的类,如比较函数对象用于排序,或者转换函数对象用于改变元素的值。 “STL...

    STL容器的一些使用简介

    "STL容器的一些使用简介" STL(Standard Template Library)是C++标准库中的一部分,提供了一些常用的数据结构和算法。今天,我们将介绍STL容器的一些使用简介。 首先, lets talk about setprecision。这是一个...

    STL_vector容器介绍

    `std::vector`提供了一系列丰富的成员函数,这些函数使得我们能够方便地操作容器中的元素。以下是一些常见的成员函数及其用途: - **assign**: 用于将一组元素赋值给`vector`。有两种形式:一种是从迭代器范围赋值...

    effective stl 中文 pdf

    对象拷贝:条款3强调确保容器中的对象拷贝操作既轻量又正确是必要的。 容器操作优化:条款4和条款5提倡使用empty()成员函数来检查容器是否为空,以及利用范围成员函数来提高代码效率。 指针管理:条款7和条款8警告...

Global site tag (gtag.js) - Google Analytics