C++ STL中的容器

逻辑织雪使
• 阅读 2339

用C++写数据结构习题也有一段时间了,不得不说STL容器对数据结构真的很有用。

C++ STL(Standard Template Library,标准模板库)是一套功能强大的 C++ 模板类,其中包含4个组件,分别为算法、容器、函数、迭代器。

所以想总结一下自己用的容器,为什么要用它以及怎么用?

vector(向量):强化版数组

C/C++原生的数组最讨厌的就是——每次定义一个数组之前,我都要规定好它的大小。

然而天知道我的数组到底会存放多少内容,所以,为了能让我的数组大小够用,不得不把数组写得足够大,如下:


 int a[9999];

刚学C语言时我的数组经常就是这样定义的,用丑而low来形容一点也不为过,我相信不少人到现在也是这样写的。
直到遇上了vector,它的第一个吸引我的地方就是——不用再为分配数组大小而困扰了,它是一种动态数组,简单来说就是想要什么时候有多大就有多大的数组(如果你机器的内存足够大)

用法

需要引的头文件:#include<vector>
注意:引完头文件后需要using namespace std;

1.基本用法:

// 定义
int old[10]; // 传统定义数组的方法
vector<int> new; // 定义的大小为0的vector容器

// 添加元素
old[0] = 1;// 将数组0号位置元素赋值为1
new.push_back(1);// 向vector最后添加一个数据为1的元素

// 读取元素
cout << old[0];
cout << new[0];

// 修改元素
old[0] = 10;
new[0] = 10;
   
// 删除最后一个元素
new.pop_back();

可以看到,vector的读取和修改数据元素和数组的操作还是一样的。

2.常用操作

预备知识:

vector<int> new(10);// 定义一个大小为10的vector容器
vector<int>::iterator it = new.begin();// 定义一个vector容器的迭代器,初始迭代项为第一个元素

这里的迭代器,相当于指向容器某个元素的一个指针,相当于如下语句:

int old[10];
int * it = old;

只有理解了迭代器的概念,下面的操作才能会用

例如,容器内此时有三个数据:1, 3, 5,利用上面定义迭代器,可以实现如下操作:

// 向指定位置前插入元素
new.insert(it + 1, 10);

结果容器中的元素变为:1, 10, 3, 5

// 删除指定位置元素
new.erase(it + 2);

结果容器中的元素变为:1, 10, 5

// 使用下标遍历
for(int i = 0; i < new.size(); i++)
{
    cout << new[i];
}
// 使用迭代器遍历
for(;it != new.end(); it++)
{
    cout << (*it);
}

容器的数据元素不光可以是int,double,char这些基本数据类型,也可以是结构体,类,如下:

class Teacher
{
    int id;
    string name;   
};

vector<Teacher> teachers;

map:键值对

在写哈夫曼编码时,需要将符号和对应的编码一一对应存放,例如'A'=>01,'B'=>001等,在不知道map以前,要实现这样的一一对应,有这样两种思路:

  1. 定义两个数组,通过下标一一对应

C++ STL中的容器

  1. 新建一个对象数组,每个对象中都有character和code这两个属性

C++ STL中的容器
但是无论是哪种,在定义和使用上都存在一定的不方便。
如果你还记得thinkphp5的教程,那你一定对数组这样的用法并不陌生:var_dump(teacher['id'])
map就可以让数组实现这样的一一对应:

C++ STL中的容器

用法

需要引的头文件:#include<map>
1.基本用法


map<char, string> hafucode;// 声明一个键为char类型,值为string类型的map容器

简单解释一下键(key)和值(value),以这条语句为例teacher['A'] = 01,[]中的就是键,而01就是值,两者一一对应

// 单个插入数据
hafucode['A'] = "01"; // 向容器内插入键为'A',值为"01"的键值对

// 读取数据
cout << hafucode['A']; // 输出结果为01

// 根据键查询,找到返回指向该键的迭代器,否则返回指向end的迭代器
map<char, string>::iterator it;
it = hafucode.find('A');

// 修改数据
hafucode['A'] = "00";

// 删除键为A的元素
hafucode.erse('A');

其他操作与vector大同小异,在此不做赘述。

总结

  1. STL的容器除了vector和map,还有list,set,deque,queue,stac等等,只要掌握了其中一两个容器的用法,其他容器的操作也就很容易就上手了
  2. 善用STL中的各种容器及算法,会极大地简化程序的设计,而把主要精力用于算法的实现上来。
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
STL 容器和迭代器连载1_简介
/文件名:STL_con_ite_1.cpp开发人员:袁培荣当前版本:1.0.0.2595创建时间:20120520
小万哥 小万哥
2年前
C++ STL容器和算法:详解和实例演示
CSTL(标准模板库)提供了一组丰富的容器和算法,使得开发者能够更加高效地编写程序。本文将介绍STL中的一些常用容器和算法。容器vectorvector是一个动态数组,可以在运行时调整大小。它的优点在于可以快速地访问元素,缺点是在插入和删除元素时需要移
cpp加油站 cpp加油站
3年前
【deque容器系列一】基于STL源码分析deque容器整体实现及内存结构
本篇文章基于gcc中stl的源码介绍deque容器的整体实现和它的内存结构。说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。首先呢,还是看一下思维导图,如下:1.deque容器整体源码实现介绍deque容器是stl中顺序容器的一种,之前已经介绍过array和vector了,今天介绍deque容器,deque的本质是一个类模板,它的
cpp加油站 cpp加油站
3年前
【STL源码拆解】基于源码分析forward_lsit容器实现(详细!)
本篇文章介绍一下c11中新增的顺序容器forwardlist,基于stl的源码分析一下该容器的整体实现及数据结构。说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。按照惯例,还是先看一下本文大纲,如下:1.forwardlist是什么forwardlist是c11为STL新增加的一种顺序容器,使用的时候包含头文件forwar
Stella981 Stella981
3年前
C++中vector的使用
在c中,vector是一个十分有用的容器。作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。vector在C标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类(https://www.oschina.net/action/GoToLink?url
Stella981 Stella981
3年前
C++STL容器deque
deque简介deque属于序列式容器,和vector十分相似,采用dynamicarray来管理元素,提供随机访问,但是deque的dynamicarray头尾两端都开放,可以在头尾两端快速安插和删除。!(https://img2018.cnblogs.com/blog/1520224/201902/15202242019
Wesley13 Wesley13
3年前
C++:模板类
22.模板类22.1模板类模板是泛型编程的基础,那什么是泛型编程呢?泛型编程是一种独立于任何特定数据类型编写代码的方式。C标准模板库中的数据容器、迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。比如动态数组vector是可以存放任何类型数据的容器,我们可以定义许多不同类型的vector,比如vector<int或vect
Wesley13 Wesley13
3年前
C++系统学习之八:IO库
  新的C标准中有三分之二的内容都是描述标准库。接下来重点学习其中几种核心库设施,这些是应该熟练掌握的。  标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围内的元素上或其他类型的序列上进行操作)。  该篇主要学习IO库。  C语言不直接处理输入输出,而是通过一簇标准库中的IO库来处理。IO库定
小万哥 小万哥
2年前
Java 容器详解:使用与案例
Java容器是一套工具,用于存储数据和对象。可以与C的STL类比。Java容器也称为JavaCollectionFramework(JCF)。除了存储对象的容器之外,还提供了一套工具类,用于处理和操作容器中的对象。总体来说,这是一个框架,它包含了Jav
小万哥 小万哥
1年前
C++ 资源大全:标准库、Web框架、人工智能等 | 最全整理
C资源列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等目录标准库C标准库,包括了STL容器,算法和函数等。:是一系列类和函数的集合,使用核心语言编写,也是CISO自身标准的一部分。:标准模板库。:P