C++ 标准模板库(STL)——容器(Containers)的用法及理解
C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector)、队列(queue)、栈(stack)、set、map等。这次主要介绍C++ 标准模板库(STL)中常用的容器(管理某一类对象的集合)用法以及自己的理解。
一、向量(vector)
向量(vector)容器与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求。例如:
#include<iostream>
#include<vector> //vector模板库
using namespace std; int main()
{
vector<int> int_vec; //定义vector: vector <类型> 名称
for (int i = 0; i < 5; i++)
{
int_vec.push_back(i); //vector.push_back(): 从vector末尾加入一个元素
}
cout << int_vec.front() << endl; //vector.front(): 返回vector当前第一个元素值
cout << int_vec[2] << endl; //vector[2]: 返回vector当前第三个元素值
cout << int_vec.back() << endl; //vector.back(): 返回vector当前最后一个元素值
cout << int_vec.size() << endl; //vector.size(): 返回vector当前的长度(大小)
int_vec.pop_back(); //vector.pop_back(): 从vector末尾删除一个元素
cout << int_vec.size() << endl;
int_vec.clear(); //vector.clear(): 清空vector
if (int_vec.empty()) //vector.empty(): 返回vector是否为空,1为空、0不为空
{
cout << "int_vec is empty !" << endl;
}
return 0;
}

注意:vector容器是支持随机访问的,即可以像数组一样用 [ ] 来取值;但不是所有的C++ STL容器都有这个性质。
二、队列(queue)与双向队列(deque)
与栈相反,队列(queue)是一种严格的“先进先出”数据结构;在C++ STL中队列容器的用法举例如下:
#include<iostream>
#include<queue> //queue模板库
using namespace std; int main()
{
queue<char> char_que; //定义queue: queue <类型> 名称
for (int i = 0; i < 5; i++)
{
char_que.push( i + 'a'); //queue.push(): 从queue末尾加入一个元素
}
cout << char_que.front() << endl; //queue.front(): 返回queue的队首元素
cout << char_que.back() << endl; //queue.back(): 返回queue的队尾元素
cout << char_que.size() << endl; //queue.size(): 返回queue当前的长度(大小)
char_que.pop(); //queue.pop(): 从queue末尾删除一个元素
cout << char_que.back() << endl;
cout << char_que.size() << endl;
if (!char_que.empty()) //queue.empty(): 返回queue是否为空,1为空、0不为空
{
cout << "char_que is not empty!" << endl;
}
return 0;
}

注意:queue不支持随机访问,即不能像数组一样地任意取值。并且,queue并不支持全部的vector的内置函数。比如queue不可以用clear()函数清空,清空queue必须一个一个弹出。同样,queue也并不支持遍历,无论是数组型遍历还是迭代器型遍历统统不支持,所以没有begin(),end()函数。
但双向队列(deque)与一般队列不同,他支持双向操作,即同时可以在队首或队尾插入或删除元素;同时,双向队列支持随机访问,即通过deque[index]访问。具体用法如下:
#include<iostream>
#include<queue> //queue模板库
using namespace std; int main()
{
deque<char> char_deque;
for (int i = 0; i < 5; i++)
{
char_deque.push_front(i + 'a'); //从deque末尾加入一个元素
char_deque.push_back(i + 'A'); //从deque末尾加入一个元素
}
cout << char_deque.front() << endl; //返回deque的队首元素
cout << char_deque.back() << endl; //返回deque的队尾元素
cout << char_deque[3] << endl; //返回deque下标为3的元素
cout << char_deque.size() << endl; //返回deque当前的长度(大小)
char_deque.pop_front(); //从deque首部删除一个元素
char_deque.pop_back(); //从deque末尾删除一个元素
cout << char_deque.front() << endl;
cout << char_deque.back() << endl;
cout << char_deque.size() << endl;
if (!char_deque.empty()) //返回deque是否为空,1为空、0不为空
{
cout << "char_deque is not empty!" << endl;
}
return 0;
}

三、栈(stack)
栈(stack)是一种基本的“先进后出”数据结构,在C++ STL 中将栈模板化了;具体用法如下:
#include<iostream>
#include<stack> //stack模板库
using namespace std; int main()
{
stack<int> int_stack; //satck定义:stack <变量类型> 名称
for (int i = 0; i < 5; i++)
{
int_stack.push(i); //satck.push():从stack栈顶加入一个元素
}
for (int i = 0; i < 5; i++)
{
cout << int_stack.size() << endl; //satck.size():返回stack当前的长度(大小)
cout << int_stack.top() << endl; //satck.top():返回stack的栈顶元素
int_stack.pop(); //satck.pop():从stack栈顶弹出一个元素
}
if (int_stack.empty()) //satck.empty():返回stack是否为空,1为空、0不为空
{
cout << "int_stack is empty !" << endl;
}
return 0;
}

事实上,C++ STL 中stack容器并不是一种标准的数据结构,它其实是一个容器适配器,里面还可以存其他的STL容器。
四、集合(set)
set容器在C++ STL实现了这个集合的功用,它的功用就是维护一个集合,其中的元素满足互异性。即两两不同,如果这个setset容器中已经包含了一个元素i,那么无论我们后续再往里假如多少个i,这个set中还是只有一个元素i。其次,数学中的集合是有无序性的,但是set容器中的元素是默认排好序(按升序排列)的。其具体用法如下:
#include<iostream>
#include<set> //set模板库
using namespace std; int main()
{
set<int> int_set;
for (int i = 0; i < 5; i++)
{
int_set.insert(i); //set.insert():向set中加入元素
}
for (auto start = int_set.begin(); start != int_set.end(); start++)
{
//set.begin()函数和set.end()函数返回set的首尾迭代器
cout << *start << endl;
}
cout << int_set.size() << endl; //set.size():返回当前set的元素个数
auto it = int_set.find(2); //set.find():返回set中指向元素k的迭代器。如果不存在这个元素,就返回set.end()
cout << *it << endl;
int_set.erase(2); //set.erase():向set中删除指定元素
int_set.clear(); //set.clear():清空当前set
if (int_set.empty()) //set.empty():返回set是否为空,是返回1,否则返回0.
{
cout << "int_set is empty !" << endl;
}
return 0;
}

五、map
C++ STL中map是“映射容器”,其存储的两个变量构成了一个键值(key)到元素(value)的映射关系。具体用法如下:
#include<iostream>
#include<map> //map模板库
using namespace std; int main()
{
map<int, char> my_map; //map定义:map<类型, 类型> 名称
my_map[0] = 'a'; //map[key] = value:map直接赋值
my_map[1] = 'b';
my_map.insert(map<int, char>::value_type(2, 'c')); //map.insert():map插入元素
auto it = my_map.find(2); //map.find():通过键值查找map中的指定元素
cout << "key: " << it->first << " value: " << it->second << endl;
my_map.erase('b'); //map.erase():删除map中的指定元素
cout << my_map.size() << endl; //map.size():返回map元素个数
for (auto it = my_map.begin(); it != my_map.end(); it++) //map.begin()、map.end():返回map的首、尾迭代器
{
cout << "key: " << it->first << " value: " << it->second << endl;
}
my_map.clear(); //map.clear():删除map所有元素
if (my_map.empty()) //map.empty():返回map是否为空,为空返回1否则0
{
cout << "my_map is empty !" << endl;
}
return 0;
}

六、容器间的嵌套
(1)自身嵌套
vector<vector<int>> two_vec;
(2)交叉嵌套
stack<vector<int>>;
C++ 标准模板库(STL)——容器(Containers)的用法及理解的更多相关文章
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
- STL学习系列之一——标准模板库STL介绍
库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...
- 标准模板库--STL
标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- 【c++】标准模板库STL入门简介与常见用法
一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...
随机推荐
- nginx 的访问日志切割
1. 高级用法–使用 nginx 本身来实现 当 nginx 在容器里,把 nginx 日志挂载出来的时候,我们发现就不适合再使用 kill -USR1 的方式去分割日志这时候当然就需要从 nginx ...
- NOIP模拟5 T2
题面:求出满足以下条件的 n*m 的 01 矩阵个数: (1)第 i 行第 1~li 列恰好有 1 个 1 (li+1到ri-1不能放1) (2)第 i 行第 ri~m 列恰好有 1 个 1. ...
- 聊聊 apt sources.list 文件格式
前言 之前玩 ubuntu 需要切换国内源地址时,都是网上复制别人提供好的,也不知道是什么意思,拿来就用. 这次花点时间来看一下 apt sources.list 的格式,以及其表示的含义. 格式 s ...
- JVM中的堆的新生代、老年代、永久代详解
JVM中的堆一般分为三大部分:新生代.老年代.永久代,其大致的占比如下: 一.新生代 新生代主要用来存放新生的对象.一般占据堆空间的1/3.在新生代中,保存着大量的刚刚创建的对象,但是大部分的对象都 ...
- 工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例
Activiti高级功能简介 Activit的高级用例,会超越BPMN 2.0流程的范畴,使用Activiti高级功能需要有Activiti开发的明确目标和足够的Activiti开发经验 监听流程解析 ...
- Redis--狂神说Redis基础汇总(完结)
Redis--狂神说Redis基础汇总(完结) 2021.6.12-2021.6.14:端午学学玩玩弄完了Redis基础的汇总,越学越觉得自己知识量的匮乏. 参考链接:狂神说Java--Redis汇总 ...
- Effective Fusion Factor in FPN for Tiny Object Detection
微小目标检测的FPN有效融合因子 摘要:基于FPN的检测器在一般物体检测方面取得了显著的进步,例如MS COCO和PASCAL VOC.然而,这些检测器在某些应用场景中会失败,例如微小物体检测.在本文 ...
- sql server数据库性能优化之2-避免使用CTE公用表达式的递归【by zhang502219048】
数据库优化中的一个实例,记录一下: 1. 原来用了CTE公用表达式的递归,reads高达约40万,看查询执行计划,使用了Nested Loops: 2. 优化去掉递归,改用其它方式实现,reads降低 ...
- 不使用synchronized和lock,如何实现一个线程安全的单例
单例,大家肯定都不陌生,这是Java中很重要的一个设计模式.稍微了解一点单例的朋友也都知道实现单例是要考虑并发问题的,一般情况下,我们都会使用synchronized来保证线程安全. 那么,如果有这样 ...
- 4.2tensorflow多层感知器MLP识别手写数字最易懂实例代码
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1 多层感知器MLP(m ...