c++ 顺序容器常用知识总结
2021-04-20 15:29
标签:可变 begin pre push 内存 相同 priority 类型 空格 正文 容器是一种容纳特定类型对象的集合。C++的容器可以分为两类:顺序容器和关联容器。顺序容器的元素排列和元素值大小无关,而是由元素添加到容器中的次序决定的。标准库定义了三种顺序容器的类型:vector、list和deque(双端队列)。此外,标准库还提供了三种容器适配器:stack、queue和prioroty_queue类型。适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。见下表 ps:有关于unsingned int 与 size_t的有关区分 它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。 size_t 类型定义在cstddef头文件中 size_t的全称应该是size type,就是说“一种用来记录大小的数据类型” 例子: 通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型 void *malloc(size_t n); void *memcpy(void *s1, void const *s2, size_t n); size_t strlen(char const *s); size_t的真实类型与操作系统有关。 在32位架构中被普遍定义为: typedef unsigned int size_t; 在32位架构上是4字节 在64位架构中被定义为: typedef unsigned long size_t; 在64位架构上是8字节 size_t为无符号数 int在不同架构下都是4字节,与size_t不同 int为带符号数,size_t为无符号数。 因为: size_t的取值range是目标平台下最大可能的数组尺寸 使用Int既有可能浪费,又有可能范围不够大 使用size_t可能会提高代码的可移植性、有效性或者可读性,或许同时提高这三者。 细节详情请看:https://jeremybai.github.io/blog/2014/09/10/size-t 定义一个容器类型的对象之前,必须包含相关的头文件。如下: 所有容器都定义了默认构造函数,可以用默认构造函数来初始化一个空的容器对象,如下: 此外,容器还有几种构造函数,可以用来初始化容器对象,如下: 值得注意到是,接受容器大小做形参的构造函数只适用于顺序容器,不适用于关联容器。由于指针就是迭代器,因此我们还可以通过使用内置数组中的一对指针初始化容器: 前面我们说过,容器是存储某中类型元素的集合,所以可以定义元素是容器类型的容器。例如,可以定义vector类型的容器ivec,其元素为string类型的vector。但是注意,在指定容器元素为容器类型时,必须使用如下空格: 顺序容器内置了一些有用的操作:(1)在容器中添加元素;(2)在容器中删除元素;(3)设置容器大小;(4)(如果有的话)获取容器内的第一个和最后一个元素。 begin和end操作产生指向容器内第一个元素和最后一个元素的下一位置的迭代器。此外还有逆序迭代器(逆序迭代器从后向前遍历容器,并反转了某些相关的迭代器操作)rbegin和rend。如下: 下表为在顺序表中添加元素的操作。注意其中的适用范围和返回类型。 其中push_front只适用于list和deque容器类型,这个操作实现在首部插入新元素的功能。 需要注意的是,任何insert或push操作都可以导致迭代器失效。所以在编写循环将元素插入到vector和deque容器中时,程序必须确保迭代器在每次循环后都的到更新。 所有容器都提供以下与容器大小相关的操作。注意resize操作可能会使迭代器失效。 在vector和deque容器上做resize操作有可能会使其所有迭代器都失效。对于所有的容器类型,如果resize操作压缩了容器,则指向已删除的元素的迭代器会失效。 以下为访问容器元素的操作。注意·使用越界的下标,或调用空容器的front或back函数,都会导致程序出现严重的错误。 以下为删除容器元素的操作。删除操作会使一些迭代器失效,需要特别注意。下表第一个操作在删除元素前,必须保证迭代器不是指向end的迭代器。 下表为顺序容器的赋值操作。赋值后左右两边容器相等,尽管赋值之前两个容器的大小不同,但赋值之后两个容器的长度都为右操作数的长度。 c++ 顺序容器常用知识总结 标签:可变 begin pre push 内存 相同 priority 类型 空格 原文地址:https://www.cnblogs.com/pipi-rtq/p/STL_2_pipi.html顺序容器
vector //可变大小数组,支持快速随机访问,在尾部之外的位置插入或删除元素 可能很慢
deque //双端队列,支持快速随机访问,在头尾位置插入或删除元素很快
list //双向链表,支持双向顺序访问,在list任何位置插入或删除元素都很快顺序容器适配器
stack //后进先出(LIFO)栈
queue //先进先出(FIFO)队列
priority_queue //有优先级管理的队列
forward_list //单向链表,只支持单向顺序访问,在任何位置插入或删除元素都很快
array //固定大小数组,支持快速随机访问,不能添加或删除元素
string //与vector类似,但专用于保存字符。随机访问快。在尾部删除/插入速度快。
//list与forward_list不支持元素的随机访问
一.定义和初始化
#include
#include
list
C
char *words[]={"Hi","How","Are","You“};
size_t words_size=sizeof(words)/sizeof(char *);
// 使用整个数组初始化words
list
vector > ivec; //合法。在两个>之间有空格
vector
二.常用操作
1.begin和end
c.begin() 返回一个迭代器,它指向容器c的第一个元素
c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置
c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素
c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素的前一个位置
2.容器添加元素操作
c.push_back() 在容器c的尾部添加值为t的元素。返回void类型
c.push_front(t) 在容器c的前端添加值为t的元素。返回void类型。只适用于list和deque容器类型
c.insert(p,t) 在迭代器p所指向的元素前面插入值为t的新元素。返回指向新添加元素的迭代器
c.insert(p,n,t) 在迭代器p所指向的元素前面插入n个值为t的新元素。返回void类型
c.insert(p,b,e) 在迭代器p所指向的元素前面插入由迭代器b和e标记的范围内的元素。返回void类型
//用push_front在容器尾部依次添加0,1,2,3
list
vector
3.容器大小的操作
c.size() 返回容器c中元素的个数。返回类型为c::size_type
c.max_size() 返回容器c可以容纳的最多的元素个数.返回类型为c::size_type
c.empty() 返回标记容器大小是否为0的布尔值
c.resize(n) 调整容器c的长度大小,使其能容纳n个元素。如果n
4.访问容器元素的操作
c.back() 返回容器c的最后一个元素的引用。如果c为空,则该操作未定义
c.front() 返回容器c的第一个元素的引用。如果c为空,则该操作未定义
c[n] 返回下标为n的元素的引用。如果n=c.size(),则该操作未定义。只适用于vector和deque容器
c.at(n) 返回下标为n的元素的引用。如果下标越界,则该操作未定义。只适用于vector和deque容器
5.删除容器元素的操作
c.erase(p) 删除迭代器p指向的元素。返回一个迭代器,它指向被删除元素后面的元素。如果p指向容器内最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。
如果p本身就是超出容器末端的下一个位置,则该函数未定义
c.erase(b,e) 删除迭代器b和e所标记的范围内所有元素。返回一个迭代器,它指向被删除元素段后面的元素。如果e本身就是指向超出容器末端的下一个位置,
则返回的迭代器也指向容器末端的下一个位置c.clear() 删除容器c内的所有元素。返回void
c.pop_back() 删除容器c的最后一个元素。返回void。如果容器为空,则该函数未定义
c.pop_front() 删除容器c的第一个元素。妇女会void。如果容器为空,则该函数未定义。只适用于list和deque容器。
6.容器的赋值与swap操作
c1=c2 删除容器c1的所有元素,然后将c2的元素复制给c1。c1和c2的类型必须相同
c1.swap(c2) 交换c1和c2的内容,c1和c2的类型必须相同。其效率比把c2元素复制到c1中要高
c.assign(b,e) 重新设置c的元素:将迭代器b和e标记范围内的元素复制到c中。b和e必须不是指向c中元素的迭代器
c.assign(n,t) 将容器c重新设置为存储n个值为t的元素
上一篇:tcp与线程结合
下一篇:数据结构和算法-数组队列