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

news2024/11/25 19:32:35

简介: 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() {

  // array
  array<int*, 5> arr = {nullptr};
  cout << "Array size: " << arr.size() << endl;

  // vector
  vector<int*> vec;
  cout << "Vector size: " << vec.size() << endl;
  vec.push_back(nullptr);
  cout << "Vector size: " << vec.size() << endl;

  // list
  list<int*> lis;
  cout << "List size: " << lis.size() << endl;
  lis.push_back(nullptr);
  cout << "List size: " << lis.size() << endl;

  // stack
  stack<int*> sta;
  cout << "Stack size: " << sta.size() << endl;
  sta.push(nullptr);
  cout << "Stack size: " << sta.size() << endl;

  // queue
  queue<int*> que;
  cout << "Queue size: " << que.size() << endl;
  que.push(nullptr);
  cout << "Queue size: " << que.size() << endl;

  // deque
  deque<int*> deq;
  cout << "Deque size: " << deq.size() << endl;
  deq.push_back(nullptr);
  cout << "Deque size: " << deq.size() << endl;

  // set
  set<int*> se;
  cout << "Set size: " << se.size() << endl;
  se.insert(nullptr);
  cout << "Set size: " << se.size() << endl;

  // map
  map<int*, int> ma;
  cout << "Map size: " << ma.size() << endl;
  ma[nullptr] = 0;
  cout << "Map size: " << ma.size() << endl;

  // unordered_map
  unordered_map<int*, int> ump;
  cout << "Unordered Map size: " << ump.size() << endl;
  ump[nullptr] = 0;
  cout << "Unordered Map size: " << ump.size() << endl;

  // array-based stack
  stack<int*, vector<int*>> abs;
  cout << "Array-based Stack size: " << abs.size() << endl;
  abs.push(nullptr);
  cout << "Array-based Stack size: " << abs.size() << endl;

  // forward_list
  forward_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;

  // multimap
  multimap<int*, int> mmap;
  cout << "Multimap size: " << mmap.size() << endl;
  mmap.insert({nullptr, 0});
  cout << "Multimap size: " << mmap.size() << endl;

  // unordered_set
  unordered_set<int*> use;
  cout << "Unordered Set size: " << use.size() << endl;
  use.insert(nullptr);
  cout << "Unordered Set size: " << use.size() << endl;

  // string
  string str;
  cout << "String size: " << str.size() << endl;
  str.push_back('\0');
  cout << "String size: " << str.size() << endl;

  // bitset
  bitset<1> bits;
  cout << "Bitset size: " << bits.size() << endl;
  bits[0] = 0;
  cout << "Bitset size: " << bits.size() << endl;

  // unordered_multiset
  unordered_multiset<int*> umse;
  cout << "Unordered Multiset size: " << umse.size() << endl;
  umse.insert(nullptr);
  cout << "Unordered Multiset size: " << umse.size() << endl;

  // unordered_multimap
  unordered_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.coloradmin.cn/o/1049539.html

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

相关文章

处理conda安装工具的动态库问题——解决记录 libssl.1.0.0 系统中所有openssl位置全览 whereis openssl

处理conda安装工具的动态库问题——解决记录 处理conda安装工具的动态库问题——解决记录 - 简书 解决libssl.so.1.0.0: cannot open shared object file: No such file or directory问题 - 简书 openssl 默认版本问题&#xff08;Anaconda相关&#xff09;_anaconda openssl-…

Pikachu-xxe (xml外部实体注入漏洞)过关笔记

Pikachu-xxe过关笔记 有回显探测是否有回显file:///协议查看本地系统文件php://协议查看php源代码&#xff08;无法查看当前网页代码&#xff0c;只能看别的&#xff09;http://协议爆破开放端口&#xff08;两者的加载时间不同&#xff09; 无回显第一步第二步第三步 运行结果…

docker系列(9) - docker-compose

文章目录 9. compose编排9.1 介绍9.2 安装9.3 compose常用命令9.4 编排微服务9.4.1 准备docker-compose.yml9.4.2 启动服务9.4.3 测试验证 9. compose编排 9.1 介绍 多服务部署工具&#xff0c;通过一个docker-compose.yml模板文件&#xff0c;定义一组关联的应用容器为一个项…

Android shape记录

之前一直觉得dataPath很好用&#xff0c;可以画各种矢量图。今天发现用shape画图也不错&#xff0c;记录一下自己用shape画的图。 一般使用shape就是定义形状、stroke边、solid内部、corners圆角等&#xff0c;代码 <?xml version "1.0" encoding "utf-8&q…

数据结构-快速排序-C语言实现

引言&#xff1a;快速排序作为一种非常经典且高效的排序算法&#xff0c;无论是工作还是面试中广泛用到&#xff0c;作为一种分治思想&#xff0c;需要熟悉递归思想。下面来讲讲快速排序的实现和改进。 老规矩&#xff0c;先用图解来理解一下&#xff1a;&#xff08;这里使用快…

【时区】Flink JDBC 和CDC时间字段时区 测试及时间基准

关联文章: 各种时间类型和timezone关系浅析 一、测试目的和值 1. 测试一般的数据库不含time zone的类型的时区。 mysql timestamp(3) 类型postgres timestamp(3) 类型sqlserver datetime2(3) 类型oracle类型 TIMESTAMP(3) 类型 在以下测试之中均为ts字段 2.测试CDC中元数据…

为什么 Go 语言 struct 要使用 tags

在 Go 语言中&#xff0c;struct 是一种常见的数据类型&#xff0c;它可以用来表示复杂的数据结构。在 struct 中&#xff0c;我们可以定义多个字段&#xff0c;每个字段可以有不同的类型和名称。 除了这些基本信息之外&#xff0c;Go 还提供了 struct tags&#xff0c;它可以用…

IPsec_SSL VPN身份鉴别过程简要

一、IPsec VPN身份鉴别&#xff08;参考国密标准《GMT 0022-2014 IPsec VPN技术规范》&#xff09; IKE第一阶段&#xff08;主模式&#xff09; “消息2”由响应方发出&#xff0c;消息中具体包含一个SA载荷&#xff08;确认所接受的SA提议&#xff09;、响应方的签名证书和…

1分钟快速实现Redis数据对比

在上篇「Redis高效、安全的不停机数据迁移方案」的文章中&#xff0c;介绍了NineData在Redis迁移场景下的性能和优势。因为数据在主备、多云和多区域环境之间的迁移流动&#xff0c;难免会产生数据一致性的问题&#xff0c;而结构与数据不一致往往是导致故障的原因之一。所以&a…

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测&…

stl格式-3D三角形

文章目录 什么是stl文件?格式首选stl的语法1.这是一个stl格式的文件:(ASCII码)2.下面先举个例子(难度略微提示)补充:关于\<\<我试了一下:这个法线你随便写好像也没问题\>> 3.来个立方体4.最后再写一个由三个直角形组成的立方体(直棱锥)5.amend 修正(右手定则,法线…

纯css html 真实水滴效果

惯例,不多说直接上图 秉承着开源精神,我们将这段代码无私地分享给大家&#xff0c;因为我们深信&#xff0c;信息的共享和互相学习是推动科技进步的关键。我们鼓励大家在使用这段代码的同时&#xff0c;也能够将其中的原理、思想和经验分享给更多的人。 这份代码是我们团队用心…

基于Linux系统聊天室增加数据库sqlite功能实现(08)

全部掌握后&#xff0c;开始进入本篇。 一. 调整目录结构 为了方便编译&#xff0c;现在我们将前面文章的代码结构做如下调整。 rootubuntu:/mnt/hgfs/code/chat# tree . . ├── chat_client │ ├── include │ ├── Makefile │ ├── obj │ │ └── …

面试总结之Spring篇

一、AOP 1、什么是AOP 1.1、概述 AOP&#xff08;Aspect-Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;即把一些业务逻辑中的相同代码抽取出来&#xff0c;让业务逻辑更加简练清爽 如果要CRUD写一堆业务&#xff0c;可如何实现业务代码前后进行打印…

自动化测试工具之Selenium IDE录制教程

一、下载Selenium IDE 下载传送带&#xff1a;Selenium IDE Open source record and playback test automation for the web 这里Darren洋以firefox火狐浏览器为例&#xff0c;将以上下载url直接在firefox浏览器中打开&#xff0c;点击对应下载按钮后&#xff0c;就会进入添加…

【网络协议】TCP

TCP协议全称为传输控制协议(Transmission Control Protocol).要理解TCP就要从他的特性开始说&#xff0c;这些特性各自之间或多或少各有联结&#xff0c;需要以宏观视角来看待。 目录&#xff1a; 1.TCP报文格式 因为报文解释过于繁琐&#xff0c;具体内容请看这篇文章TCP报文…

架构案例2022(四十二)

促销管理系统 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性&#xff0c;由于当前用户规模不大&#xff0c;业务也相对…

PDF文件超出上传大小?三分钟学会PDF压缩

PDF作为一种流行的文档格式&#xff0c;被广泛用于各种场合&#xff0c;然而有时候PDF文件的大小超出了上传限制&#xff0c;这时候我们就需要采取一些措施来减小PDF文件的大小&#xff0c;下面就给大家分享几个方法&#xff0c;一起来学习下吧~ 方法一&#xff1a;嗨格式压缩大…

windows WSL配置cuda,pytorch和jupyter notebook

机器配置 GPU: NVIDIA Quadro K2000 与 NVIDIA 驱动程序捆绑的CUDA版本 但按照维基百科的描述&#xff0c;我的GPU对应的compute capability3.0&#xff0c;允许安装的CUDA最高只支持10.2&#xff0c;如下所示。 为什么本地会显示11.4呢&#xff1f;对此&#xff0c;GPT是这…

R语言分析:如何轻松地把数据分为三、四、五等份?

有网友问了&#xff0c;我如何对连续型资料进行分组&#xff0c;常见的有按照中位数分组、四分位数分组&#xff0c;甚至分为5组。 这个问题其实很简单的了。 用两个函数&#xff0c;一个是quantile函数&#xff0c;另外一个是cut函数 1. quantile()函数的应用 该函数目的是获得…