音视频开发之旅(22) STL 之 容器

目录

  1. STL的六大部件介绍
  2. 容器分类
  3. 序列式容器介绍(vector、list、deque)
  4. 关联式容器
  5. 资料
  6. 收获

一、STL六大部件

STL:cpp standard library cpp标准库

STL的六大部件compounts:

  1. 容器 (Containers)
  2. 分配器(Allocators)
  3. 算法(Algorithms)
  4. 迭代器(Iteratros)
  5. 适配器(Adapters)
  6. 仿函数(Functors)

其中比较重要或者常用的部件是:容器、算法、迭代器、仿函数
迭代器是连接容器和算法的桥梁,仿函数是对“()”的操作符重载。接下来我们会重点学习实践容器和算法。而本篇主要介绍各种容器的特性。

二、容器分类

容器从内存分配是否是连续上来划分,可以分为序列式容器和关联式容器以及无序容器。

序列式容器:强调值的排序,每个元素都有固定的位置

包含以下几种容器类型:

  1. Array(数组 固定大小)
  2. Vector(向量 会自动扩充)、
  3. Deque(双向队列,前后都可以扩充)
  4. List:链表(双向链表)
  5. Forward-list:(单项链表)

关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系。
使用场景:大量查找

包含以下几种容器:

  1. Set/Multiset
  2. Map/Multimap :key-Value

其中 Set 和Map 元素内容不可以重复,Multiset和Multimap 元素内容可重复

内部是高度平衡的树即红黑树结构


无序容器
HashTable Separate Chaining

三、序列式容器介绍(vector、list、deque)

3.1 vector

Vector和普通数组的区别在于,数组是静态空间,vector是动态扩展。这里的动态扩展并不是在原空间之后续接新空间,而是寻找更大的内存空间,以两倍增长的方式 ,将原数据拷贝过去。

获取数据的方式

[]
at
front
back

容器互换: swap()
查看容器的容量: capacity()
重新制定vector容器大小: resize()

3.2 list 链表

链表是由一个个节点组成,节点包含 数据域和指针域。

优点:对任意位置可以快速添加删除数据,只需要改变节点指针域的指向,而不用移动后续位置;大小比较灵活,不用想vector的双倍扩展
缺点:遍历速度没有连续的array块;由于指针域的存在,占用的空间比array大。

Stl中的链表是一个双向循环链表。链表的迭代器只能前移或后移,不能跳跃

前加加: operator++() 返回值是self&
后加加: operator++(int) 返回值是self

3.3 deque容器

双端数组,可以对头端进香插入删除操作,deque内存上是分段连续的


顺序容器适配器栈stack 内部是deque实现
先进后出


顺序容器适配器 队列queue 先进先出,内部也是deque实现

常用的方法如下:

赋值操作

=
assign(begin,end)
assign(n,num)

大小

deque.empty() 
deque.size()
deque.resize(num)
deque.resize(num,elem)

没有容量capacity
void printDeuqe(const deque<int &d>)
{
    for(deque<int>::const_iterator it =d.begin();it !=d.end();it++)
    {
        cout << *it << "";
    }
    cout <<endl;
}

插入删除

//在容器尾部添加一个数据
push_back(elem);

//在容器头部添加一个容器
push_front(elem);

//删除容器的最后一个数据
pop_back();

//删除容器的第一个数据
pop_front();

//在pos位置插入一个elem元素的拷贝,返回新数据的位置
insert(pos,elem);
//在pos位置插入【beg,end)区间的数据
insert(pos,beg,end);

clear();
erase(pos);
erase(beg,end);

数据存取

//返回索引pos所指的数据
at(int pos);
opeartor[];
//返回容器中第一个数据元素
front();
//返回容器最后一个数据元素
back();

排序

//对beg和end区间内元素进行排序
sort(iterator beg, iterator end)

四、关联性容器

可以理解为 小型的关联型数据库

4.1 set/multiset容器

容器set中所有的元素插入时候会自动排序,其中set不允许重复值;multiset可以重复。

赋值
插入数据使用insert

赋值构造
拷贝构造

查找和统计

//查找key是否存在,如存在,返回该键的元素的迭代器;如不存在返回set.end()

find(key);

//统计key的元素个数,对于set返回值是0或1. 
count(key);

排序

利用仿函数,改变排序规则

仿函数 重载(),记得加const
如: bool opeartor()(int x, int y) const;

class Mycompare
{
public:
    bool operator()(int v1,int v2)
    {
        return v1 >v2;
    }
}

对于自定义的数据类型排序,要使用仿函数制定排序规则。
set<Object,MyCompare>

4.2 map/multimap容器

map中所有元素都是pair,其中Pair的第一元素是key,起到索引作用,第二个元素是value,所有元素都会根据元素的key自动排序。

另外容器的迭代器采用左闭右开的区间编程


这篇就到这里,了解stl的六大组件,容器的分类,以及各种容器的特点,常用方法以及部分使用场景。从下一篇开始开始学习实践算法,一起来学习吧。

五、资料

  1. 《Tinking in C++》
  2. 《C++Primer》
  3. [侯捷C++ STL 体系结构与内核分析] : https://www.bilibili.com/video/BV1db411q7B8?from=search&seid=653949808386505225 上面的图片均来自于该资源。

六、收获

  1. 了解stl的六大组件
  2. 了解序列式容器和关联式容器的分类
  3. 了解各种容器的特点,常用方法,和优缺点。

感谢你的阅读
下一篇我们开始进入算法章节的学习实践,在这也立个flag,每天更新一种类型的算法(遍历、查找、排序、拷贝、替换等),这些基础知识非常重要,来一起学习吧。 欢迎关注公众号“音视频开发之旅”,一起学习成长。
欢迎交流

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容