ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++STL标准库容器

2021-11-01 22:02:01  阅读:130  来源: 互联网

标签:容器 迭代 访问 STL 元素 C++ ++ vector


C++ 标准库容器

标准库为相关对象的存储集合提供了各种类型安全容器。容器是类模板。声明容器变量时,请指定容器将保存的元素的类型。可以使用初始值设定项列表构造容器。它们具有用于添加和删除元素以及执行其他操作的成员函数。

可使用迭代器循环访问容器中的元素以及访问单个元素。可以使用其成员函数、运算符和全局函数显式使用iterator。还可以隐式使用它们,例如通过使
用范围for循环。所有C++标准库容器的迭代器都有一个通用接口,但是每个容器都会定义自己的专用迭代器。

容器可以分为三个类别:序列容器、关联容器和容器适配器。

序列容器

序列容器维护你指定的插入元素的顺序,序列式容器中的每个元素均有固定的位置。

vector容器的行为类似于数组,但可以根据要求自动增加,是一种动态数组,实现动态扩展。vector类是使用newdelete来管理内存,但这种工作是自动完成的。它可以随机访问、连续存储,长度也非常灵活。基于上述和其它原因,vector是多数应用程序的首选序列容器。

在这里插入图片描述

vector类的功能比数组强大,但付出的代价是效率较低。如果是使用固定长度的数组,使用数组是更佳的选择,但代价是不那么方便和安全。鉴于此,array诞生了,与数组一项,array对象的长度也是固定的,也使用栈(静态内存分配),而不是自由存储区,因此效率和数组一样,但更方便,更安全。

deque(双端队列)容器支持在容器的起点和终点进行快速插入和删除。它共享随机访问和灵活长度优势,但不连续。
在这里插入图片描述
在这里插入图片描述

list容器时双向链接链表,可在容器中的任何位置实现双向访问、快速插入和快速删除,但无法随机访问容器中list元素。
在这里插入图片描述

forward_list容器时单独链表,list的向前访问版本。

关联容器

在关联容器中,按照预定义的顺序插入元素,例如按升序排序。关联容器分为两个子集:映射和组集。二叉树结构,各元素之间没有严格的物理上的顺序关系

map容器,字典类型,包含键/值对。键用于对序列排序,值与该键关联。例如,map可能包含许多键(代表文本中每个独特的单词)和相应的值(代表每个单词在文本中出现的次数)。map无序版本时unordered_map。多个相同实例为multimapunordered_multimap

set仅时按升序排列每个元素的容器,值也是键。set的无序版本时unordered_set。多个相同实例为multisetunordered_multiset

容器适配器

容器适配器时序列容器或关联容器的变体,对接口进行了限制,不支持使用iterator

queue容器遵循FIFO(先进先出)。
在这里插入图片描述

priority_queue容器优先队列,具有最高值的元素始终排在队列的第一位。

stack容器遵循FILO(后进先出)。
在这里插入图片描述

迭代器:容器和算法之间粘合剂

提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。

每个容器都有自己专属的迭代器

迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针

迭代器种类:

种类功能支持运算
输入迭代器对数据的只读访问只读,支持++、==、!=
输出迭代器对数据的只写访问只写,支持++
前向迭代器读写操作,并能向前推进迭代器读写,支持++、==、!=
双向迭代器读写操作,并能向前和向后操作读写,支持++、–,
随机访问迭代器读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器读写,支持++、–、[n]、-n、<、<=、>、>=

常用的容器中迭代器种类为双向迭代器,和随机访问迭代器

举个例子:

for (vector<vector>::iterator it = v.begin(); it != v.end(); it++) {

	for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
		cout << *vit << " ";
	}
	cout << endl;
}

标签:容器,迭代,访问,STL,元素,C++,++,vector
来源: https://blog.csdn.net/frighting_ing/article/details/121089112

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有