C++之容器类有趣的实验(二百四十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之向容器中添加nullptr空指针,容器size()会增大吗?为什么?

通过C++的20个容器类进行实验,看看有什么结果?

2.C++ 容器类介绍

C++提供了多种容器,以下是常用的20个容器及其举例:

  1. 数组 (array):固定大小的连续存储空间。例如:int numbers[5] = {1, 2, 3, 4, 5}。

  2. 向量 (vector):可变大小的动态数组。例如:vector numbers = {1, 2, 3, 4, 5}。

  3. 列表 (list):双向链表。例如:list numbers = {1, 2, 3, 4, 5}。

  4. 堆栈 (stack):后进先出 (LIFO) 的数据结构。例如:stack numbers; numbers.push(1); numbers.push(2);。

  5. 队列 (queue):先进先出 (FIFO) 的数据结构。例如:queue numbers; numbers.push(1); numbers.push(2);。

  6. 双端队列 (deque):两端都可以进行插入和删除操作的队列。例如:deque numbers = {1, 2, 3, 4, 5}。

  7. 集合 (set):不重复元素的无序集合。例如:set numbers = {1, 2, 3, 4, 5}。

  8. 映射 (map):键-值对的集合,根据键进行查找。例如:map<string, int> studentScores = {{“Alice”, 90}, {“Bob”, 85}}。

  9. 哈希表 (unordered_map):基于哈希函数实现的映射容器。例如:unordered_map<string, int> studentScores = {{“Alice”, 90}, {“Bob”, 85}}。

  10. 树 (tree):一种层次结构,如二叉搜索树 (binary search tree) 或红黑树 (red-black tree)。例如:BST树。

  11. 堆 (heap):一种优先级队列,按照特定规则进行元素的插入和删除。例如:priority_queue numbers; numbers.push(1); numbers.push(2);。

  12. 栈 (array-based stack):基于数组的栈实现。例如:stack numbers; numbers.push(1); numbers.push(2);。

  13. 单向链表 (forward_list):单向链表的容器。例如:forward_list numbers = {1, 2, 3, 4, 5}。

  14. 多重集合 (multiset):允许重复元素的集合。例如:multiset numbers = {1, 2, 2, 3, 4, 4, 4}。

  15. 多重映射 (multimap):允许重复键的映射容器。例如:multimap<string, int> studentScores = {{“Alice”, 90}, {“Bob”, 85}, {“Alice”, 95}}。

  16. 哈希集合 (unordered_set):基于哈希函数实现的集合容器。例如:unordered_set numbers = {1, 2, 3, 4, 5}。

  17. 字符串 (string):字符串容器。例如:string str = “Hello, world!”。

  18. 位集合 (bitset):固定大小的位集合容器。例如:bitset<8> bits = 8;。

  19. 链式哈希集合 (unordered_multiset):基于哈希函数实现的允许重复元素的集合容器。例如:unordered_multiset numbers = {1, 2, 2, 3, 4, 4, 4}。

  20. 链式哈希映射 (unordered_multimap):基于哈希函数实现的允许重复键的映射容器。例如:unordered_multimap<string, int> studentScores = {{“Alice”, 90}, {“Bob”, 85}, {“Alice”, 95}}。

3.实例

v1.0

#include <iostream>
#include <array>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <unordered_map>
#include <forward_list>
#include <unordered_set>
#include <string>
#include <bitset>using namespace std;int main() {// arrayarray<int*, 5> arr = {nullptr};cout << "Array size: " << arr.size() << endl;// vectorvector<int*> vec;cout << "Vector size: " << vec.size() << endl;vec.push_back(nullptr);cout << "Vector size: " << vec.size() << endl;// listlist<int*> lis;cout << "List size: " << lis.size() << endl;lis.push_back(nullptr);cout << "List size: " << lis.size() << endl;// stackstack<int*> sta;cout << "Stack size: " << sta.size() << endl;sta.push(nullptr);cout << "Stack size: " << sta.size() << endl;// queuequeue<int*> que;cout << "Queue size: " << que.size() << endl;que.push(nullptr);cout << "Queue size: " << que.size() << endl;// dequedeque<int*> deq;cout << "Deque size: " << deq.size() << endl;deq.push_back(nullptr);cout << "Deque size: " << deq.size() << endl;// setset<int*> se;cout << "Set size: " << se.size() << endl;se.insert(nullptr);cout << "Set size: " << se.size() << endl;// mapmap<int*, int> ma;cout << "Map size: " << ma.size() << endl;ma[nullptr] = 0;cout << "Map size: " << ma.size() << endl;// unordered_mapunordered_map<int*, int> ump;cout << "Unordered Map size: " << ump.size() << endl;ump[nullptr] = 0;cout << "Unordered Map size: " << ump.size() << endl;// array-based stackstack<int*, vector<int*>> abs;cout << "Array-based Stack size: " << abs.size() << endl;abs.push(nullptr);cout << "Array-based Stack size: " << abs.size() << endl;// forward_listforward_list<int*> flis;cout << "Forward List size: " << distance(flis.begin(), flis.end()) << endl;flis.push_front(nullptr);cout << "Forward List size: " << distance(flis.begin(), flis.end()) << endl;// multiset  multiset<int*> mse;cout << "Multiset size: " << mse.size() << endl;mse.insert(nullptr);cout << "Multiset size: " << mse.size() << endl;// multimapmultimap<int*, int> mmap;cout << "Multimap size: " << mmap.size() << endl;mmap.insert({nullptr, 0});cout << "Multimap size: " << mmap.size() << endl;// unordered_setunordered_set<int*> use;cout << "Unordered Set size: " << use.size() << endl;use.insert(nullptr);cout << "Unordered Set size: " << use.size() << endl;// stringstring str;cout << "String size: " << str.size() << endl;str.push_back('\0');cout << "String size: " << str.size() << endl;// bitsetbitset<1> bits;cout << "Bitset size: " << bits.size() << endl;bits[0] = 0;cout << "Bitset size: " << bits.size() << endl;// unordered_multisetunordered_multiset<int*> umse;cout << "Unordered Multiset size: " << umse.size() << endl;umse.insert(nullptr);cout << "Unordered Multiset size: " << umse.size() << endl;// unordered_multimapunordered_multimap<int*, int> ummap;cout << "Unordered Multimap size: " << ummap.size() << endl;ummap.insert({nullptr, 0});cout << "Unordered Multimap size: " << ummap.size() << endl;return 0;
}

打印结果:
Array size: 5
Vector size: 0
Vector size: 1
List size: 0
List size: 1
Stack size: 0
Stack size: 1
Queue size: 0
Queue size: 1
Deque size: 0
Deque size: 1
Set size: 0
Set size: 1
Map size: 0
Map size: 1
Unordered Map size: 0
Unordered Map size: 1
Array-based Stack size: 0
Array-based Stack size: 1
Forward List size: 0
Forward List size: 1
Multiset size: 0
Multiset size: 1
Multimap size: 0
Multimap size: 1
Unordered Set size: 0
Unordered Set size: 1
String size: 0
String size: 1
Bitset size: 1
Bitset size: 1
Unordered Multiset size: 0
Unordered Multiset size: 1
Unordered Multimap size: 0
Unordered Multimap size: 1

v2.0

#include <iostream>
#include <vector>
#include <cstring>int main() {std::vector<std::string*> buf;printf("size = %ld\n",buf.size());buf.push_back(nullptr);printf("size = %ld\n",buf.size());return 0;
}

打印结果:
size = 0
size = 1

4.实验结果

<1>.当将 nullptr 添加到 std::vectorstd::string* 中时,实际上是将一个空指针的地址添加到了容器中,并不是将空指针本身存储到容器中。

<2>.在这种情况下,使用 buf.push_back(nullptr) 是合法的,因为 std::vectorstd::string* 可以存储指针类型的元素。所以在执行完 buf.push_back(nullptr) 后,容器中会存储一个空指针的地址。

<3>.因此,当你打印 buf.size() 时,结果为 1,表示容器中有一个元素,即空指针。

<4>.注意,虽然空指针本身不占用任何内存空间,但是指针的地址存储在容器中占用了一个元素的位置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无线WIFI工业路由器可用于楼宇自动化

钡铼4G工业路由器支持BACnet MS/TP协议。BACnet MS/TP协议是一种用于工业自动化的开放式通信协议&#xff0c;被广泛应用于楼宇自动化、照明控制、能源管理等领域。通过钡铼4G工业路由器的支持&#xff0c;可以使设备间实现高速、可靠的数据传输&#xff0c;提高自动化水平。 钡…

Kubernetes(k8s)上搭建一主两从的mysql8集群

Kubernetes上搭建一主两从的mysql8集群 环境准备搭建nfs服务器安装NFS暴露nfs目录开启nfs服务器 安装MySQL集群创建命名空间创建MySQL密码的Secret安装MySQL主节点创建pv和pvc主节点的配置文件部署mysql主节点 安装第一个MySQL Slave节点创建pv和pvc第一个从节点配置文件部署my…

聚观早报 | 飞书签约韵达速递;蔚来首颗自研芯片“杨戬”量产

【聚观365】9月22日消息 飞书签约韵达速递 蔚来首颗自研芯片“杨戬”10月量产 靳玉志接任华为车 BU CEO 亚马逊发布全新Alexa语音助手 OpenAI推出图像生成器DALL-E 3 飞书签约韵达速递 近日&#xff0c;国内物流服务公司韵达快递宣布全员上飞书。飞书解决方案副总裁何斌表…

Redis学习第九天

今天是Jedis&#xff01;作者的Redis在游戏本上&#xff0c;但是Java的IDEA总是下载不了&#xff0c;所以只能作为概念听一听了&#xff0c;目前无法做到实操。 Jedis概念 Jedis实操 首先要保证redis的服务器开启&#xff0c;然后引入jedis依赖&#xff0c;最后通过服务器的I…

Java新领域—设计

SSM SpringBoot 微信小程序 JSP 安卓

人工智能安全-2-非平衡数据处理(2)

5 算法层面 代价敏感&#xff1a;设置损失函数的权重&#xff0c;使得少数类判别错误的损失大于多数类判别错误的损失&#xff1b; 单类分类器方法&#xff1a;仅对少数类进行训练&#xff0c;例如运用SVM算法&#xff1b; 集成学习方法&#xff1a;即多个分类器&#xff0c;然…

大模型lora微调-chatglm2

通义千问大模型微调源码&#xff08;chatglm2 微调失败&#xff0c;训练通义千问成功&#xff09;&#xff1a;GitHub - hiyouga/LLaMA-Efficient-Tuning: Easy-to-use LLM fine-tuning framework (LLaMA-2, BLOOM, Falcon, Baichuan, Qwen, ChatGLM2)Easy-to-use LLM fine-tun…

[JAVAee]MyBatis

目录 MyBatis简介 MyBatis的准备工作 框架的添加 连接数据库字符串的配置 MyBatis中XML路径的配置 ​编辑 MyBatis的使用 各层的实现 进行数据库操作 增加操作 拓展 修改操作 删除操作 查询操作 结果映射 单表查询 多表查询 like模糊查询 动态SQL / MyBa…

delphi 11 安装失败

delphi 11 安装遇到如下图&#xff1a; 解决方法&#xff1a; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 管理员身份&#xff01;&…

同城信息服务源码 本地生活服务小程序源码

同城信息服务源码 本地生活服务小程序源码 功能介绍&#xff1a; 基本设置&#xff1a;网站参数、安全设置、分站管理、支付设置、操作日志、地区设置、公交地铁、国际区号、清理缓存、模板风格、模块管理、域名管理、底部菜单、消息通知、登录设置 其他设置&#xff1a;关键…

企业年报API的应用:从金融投资到市场研究

引言 在数字化时代&#xff0c;企业年报不再仅仅是一份财务报告&#xff0c;它们变成了宝贵的信息资源&#xff0c;可用于各种商业应用。企业年报API已经改变了金融投资和市场研究的方式&#xff0c;使得从中获取数据变得更加高效和灵活。本文将深入探讨企业年报API的应用&…

箱讯科技成功闯入第八届“创客中国”全国总决赛—在国际物流领域一枝独秀

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 2023年9月26日&#xff0c;第八届“创客中国”数字化转型中小企业创新创业大赛决赛在贵州圆满收官。 经过初赛、复赛、决赛的激烈角逐&#xff0c;箱讯科技与众多强劲对手同台竞技&#xff0c;最终凭借出…

“全景江西·南昌专场”数字技术应用场景发布会 | 万广明市长莅临拓世集团展位,一览AIGC科技魅力

随着数字技术的迅猛发展&#xff0c;传统产业正在发生深刻的变革&#xff0c;新兴产业蓬勃兴起。但要想实现数字经济超常规发展&#xff0c;就要在数字产业化上培育新优势&#xff0c;大力实施数字经济核心产业提速行动&#xff0c;加快推进“一核三基地”建设。在这个数字经济…

Python接口自动化之unittest单元测试

以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是单元测试&#xff1f; 按照阶段来分&#xff0c;一般就是单元测试&#xff0c;集成测试&#xff0c;系统测试&#xff0c;验收测试。单元测试是对单个模块、单个类或者单个函数进行测试。 将访…

83、SpringBoot --- 下载和安装 MSYS2、 Redis

启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe redis.windows.conf 启动redis客户端&#xff1a; 小黑窗&#xff1a;redis-cli …

Mysql8安装+重装的数据备份方法【提供Mysql8.0.27版本的压缩包】

文章目录 Mysql8压缩安装包下载安装流程压缩包解压配置环境变量 初始化数据库连接数据库修改密码Mysql重装/重装系统 的数据库备份方法数据备份数据还原 Mysql8压缩安装包下载 压缩包下载路径 安装流程 压缩包解压 首先将压缩包解压&#xff0c;下图是解压之后的文件目录&a…

ChatGPT必应联网功能正式上线

今日凌晨发现&#xff0c;ChatGPT又支持必应联网了&#xff01;虽然有人使用过newbing这个阉割版的联网GPT4&#xff0c;但官方版本确实更加便捷好用啊&#xff01; 尽管 ChatGPT 此前已经展现出了其他人工智能模型无可比拟的智能&#xff0c;但由于其训练数据的限制&#xff…

jquery和jquery-ui拖动元素(vue2)

彩色小方块可以任意拖动&#xff0c;红色箭头指向的区域可以拖动 CDN在index.html文件中引入 <link rel"stylesheet" href"//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"><script src"https://code.jquery.com/jquery-3.6.0.min…

WebPack5高级使用总结(三)

WebPack5高级使用总结 1、提升开发体检1.1、SourceMap1.2、使用 2、提升打包构建速度2.1、HotModuleReplacement2.2、oneOf2.3、Include/Exclude2.4、Cache2.5、Thead 3、减少代码体积3.1、Tree Shaking3.2、Babel3.3、Image Minimizer 4、优化代码运行性能4.1、Code Split4.1.…

前端uniapp防止页面整体滑动页面顶部以上,设置固定想要固定区域宽高

解决&#xff1a;设置固定想要固定区域宽高 目录 未改前图未改样式改后图改后样式 未改前图 未改样式 .main {display: flex;flex-direction: row;// justify-content: space-between;width: 100vw;// 防止全部移动到上面位置&#xff01;&#xff01;&#xff01;&#xff01…