C++笔记之动态数组的申请和手动实现一个简单的vector

C++笔记之动态数组的申请和手动实现一个简单的vector

code review!

文章目录

  • C++笔记之动态数组的申请和手动实现一个简单的vector
    • 1.C语言中动态数组的申请与使用
    • 1.动态数组的申请
      • 使用`new`和`delete`
      • 使用`std::vector`
    • 1.std::vector的底层实现
    • 2.手动实现一个简单的vector:使用一个指向动态分配的数组的指针来存储元素模拟vector的基本行为

1.C语言中动态数组的申请与使用

在C语言中,可以使用malloc函数来动态申请内存以创建动态数组,并使用free函数来释放这些内存。以下是在C语言中创建和使用动态数组的基本示例:
在这里插入图片描述

代码

#include <stdio.h>
#include <stdlib.h>int main() {int size;printf("Enter the size of the dynamic array: ");scanf("%d", &size);// 使用malloc函数分配动态数组内存int *dynamicArray = (int *)malloc(size * sizeof(int));// 检查内存分配是否成功if (dynamicArray == NULL) {printf("Memory allocation failed.\n");return 1; // 返回错误码}// 初始化动态数组的元素for (int i = 0; i < size; i++) {dynamicArray[i] = i * 2;}// 访问和使用动态数组的元素for (int i = 0; i < size; i++) {printf("%d ", dynamicArray[i]);}// 释放动态数组内存free(dynamicArray);return 0;
}

在上述示例中,首先使用malloc函数分配了一块内存,该内存可以存储sizeint类型的元素。然后,通过循环初始化和使用动态数组的元素。最后,使用free函数释放分配的内存以防止内存泄漏。

请注意,使用mallocfree来管理内存需要特别小心,确保在不再需要动态数组时释放内存,以免出现内存泄漏。此外,动态数组的内存大小必须在运行时明确定义,并且需要手动处理分配和释放内存,这可能会引入错误,因此要特别小心。如果可能的话,推荐使用C++中的std::vector或C语言的动态数组分配方式,如allocastrdup,以减少手动内存管理的复杂性。

1.动态数组的申请

在C++中,可以使用new运算符来动态申请数组,并使用delete运算符来释放它们。此外,C++11引入了std::vector,它是一个动态数组的封装,提供了更方便和安全的方法来管理动态数组。下面分别介绍使用newstd::vector的方法来创建和使用动态数组。

使用newdelete

在这里插入图片描述

代码

#include <iostream>int main() {int size;std::cout << "Enter the size of the dynamic array: ";std::cin >> size;// 通过new运算符分配动态数组int* dynamicArray = new int[size];// 初始化动态数组的元素for (int i = 0; i < size; i++) {dynamicArray[i] = i * 2;}// 访问和使用动态数组的元素for (int i = 0; i < size; i++) {std::cout << dynamicArray[i] << " ";}// 释放动态数组内存delete[] dynamicArray;return 0;
}

使用new分配动态数组后,不要忘记使用delete[]释放内存,以防止内存泄漏。

使用std::vector

使用std::vector可以更方便地管理动态数组,无需手动分配和释放内存:

#include <iostream>
#include <vector>int main() {int size;std::cout << "Enter the size of the dynamic array: ";std::cin >> size;// 使用std::vector创建动态数组std::vector<int> dynamicArray(size);// 初始化动态数组的元素for (int i = 0; i < size; i++) {dynamicArray[i] = i * 2;}// 访问和使用动态数组的元素for (int i = 0; i < size; i++) {std::cout << dynamicArray[i] << " ";}return 0;
}

std::vector会自动处理内存分配和释放,使得代码更加安全和易维护。

无论您选择使用newdelete还是std::vector,都要确保正确管理动态数组的内存,以防止内存泄漏和访问越界错误。

1.std::vector的底层实现

C++中的vector是标准库中的一个动态数组容器,它提供了动态大小的数组,类似于C数组,但它具有自动管理内存的功能,可以动态增加或减少数组的大小。vector的底层实现通常是使用动态分配的数组,以及一些成员函数来管理这个数组的大小和元素。

下面是vector的一些常见底层实现细节:

  1. 动态分配的数组:vector内部通常使用一个指向动态分配的数组的指针来存储元素。这个数组的大小可以根据vector中存储的元素数量动态调整。当元素数量超过当前数组的容量时,vector会分配一个更大的数组,将元素从旧数组复制到新数组,然后释放旧数组。

  2. 容量(Capacity)和大小(Size):vector有两个重要的属性,容量和大小。容量表示当前数组的大小,而大小表示vector中实际存储的元素数量。容量通常大于或等于大小,因为vector可能会提前分配一些额外的空间,以减少频繁重新分配内存的开销。

  3. 动态调整容量:当vector的大小超过容量时,它会重新分配更大的内存块,并将元素从旧数组复制到新数组。这通常涉及到内存分配和复制操作,这可能会导致性能开销。为了减小重新分配的频率,vector通常会分配比当前大小更多的额外空间,以避免在每次插入元素时都重新分配内存。

  4. 内存管理:vector负责动态内存的分配和释放,以确保内存的正确管理。当vector不再需要某个内存块时,它会调用delete[]allocator::deallocate来释放内存。

  5. 迭代器:vector提供了迭代器,用于访问容器中的元素。迭代器是指向容器中元素的指针或对象,允许你遍历vector的内容。

总之,vector的底层实现是基于动态分配的数组,它使用内部指针来管理内存,并提供了各种方法来操作容器中的元素,包括插入、删除、访问等。这些实现细节在C++标准库中是隐藏的,因此你可以方便地使用vector而无需担心底层实现的细节。

2.手动实现一个简单的vector:使用一个指向动态分配的数组的指针来存储元素模拟vector的基本行为

在这里插入图片描述

运行
在这里插入图片描述

代码

#include <iostream>class MyVector {
public:MyVector() : data(nullptr), size(0), capacity(0) {}void push_back(int value) {if (size >= capacity) {// 如果当前大小超过容量,需要重新分配更大的内存int new_capacity = (capacity == 0) ? 1 : capacity * 2;int* new_data = new int[new_capacity];// 将数据从旧数组复制到新数组for (int i = 0; i < size; i++) {new_data[i] = data[i];}// 释放旧数组的内存delete[] data;// 更新指针和容量data = new_data;capacity = new_capacity;}// 在数组末尾添加新元素data[size] = value;size++;}int at(int index) {if (index >= 0 && index < size) {return data[index];} else {std::cerr << "Index out of range!" << std::endl;return -1;}}int getSize() {return size;}~MyVector() {delete[] data; // 释放动态分配的内存}private:int* data;      // 指向动态分配的数组的指针int size;       // 当前元素数量int capacity;   // 当前容量
};int main() {MyVector vec;// 向自定义的vector中添加一些元素for (int i = 1; i <= 10; i++) {vec.push_back(i * 10);}// 访问元素并打印for (int i = 0; i < vec.getSize(); i++) {std::cout << "Element at index " << i << ": " << vec.at(i) << std::endl;}return 0;
}

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

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

相关文章

Rocky 安装jdk17

1&#xff09;检测jdk是否安装&#xff1a; #运行 java -version如果提示安装&#xff0c;则输入N&#xff0c;跳过 2&#xff09;检测cpu 类型 若未安装查看linux处理器架构&#xff1a; #运行 hostnamectl #或运行 arch 3&#xff09;去官网下载相应的编译版本的Jdk Or…

CCLINK IEFB总线转ETHERNET/IP网络的协议网关使欧姆龙和三菱的数据互通的简单配置方法

想要实现CCLINK IEFB总线和ETHERNET/IP网络的数据互通。 捷米JM-EIP-CCLKIE是一款ETHERNET/IP从站功能的通讯网关&#xff0c;该产品主要功能是实现CCLINK IEFB总线和ETHERNET/IP网络的数据互通。本网关连接到ETHERNET/IP总线和CCLINK IEFB总线上都可以做为从站使用。网关分别…

代码随想录(一刷完结!!!)Day43-图论:力扣第1971e、684m题

1971e. 寻找图中是否存在路径 题目链接 代码随想录文章讲解链接 方法一&#xff1a;并查集 用时&#xff1a;10m6s 思路 时间复杂度&#xff1a; O ( n log ⁡ n ) O(n\log{n}) O(nlogn)空间复杂度&#xff1a; O ( n ) O(n) O(n) C代码 class Solution { private:vecto…

奇怪,为什么ArrayList初始化容量大小为10?

看ArrayList源码时&#xff0c;无意中看到ArrayList的初始化容量大小为10&#xff0c;这就奇怪了&#xff01;我们都知道ArrayList和HashMap底层都是基于数组的&#xff0c;但为什么ArrayList不像用HashMap那样用16作为初始容量大小&#xff0c;而是采用10呢&#xff1f; 为什…

C++笔记之lambda捕获列表中的‘this‘指针

C笔记之lambda捕获列表中的’this’指针 code review! 捕获this指针的lambda表达式在C中有多种应用场景。以下是一些示例&#xff1a; 异步编程&#xff1a;当您需要在异步操作中访问类的成员变量或成员函数时&#xff0c;可以使用捕获this指针的lambda表达式。例如&#xf…

spring Aop @Around @Before @After的区别说明

Before是在所拦截方法执行之前执行一段逻辑。 After 是在所拦截方法执行之后执行一段逻辑。 Around是可以同时在所拦截方法的前后执行一段逻辑。 spring只支持方法连接点 Aspect Component public class LogIntercept {Pointcut ( "execution(* com.ncx.controller.*.*(.…

STM32H750之FreeRTOS学习--------(四)中断管理

四、FreeRTOS中断管理 中断的概念不再过多叙述&#xff0c;学习过逻辑的都知道 中断的执行过程 中断请求 外设产生中断请求&#xff08;GPIO外部中断、定时器中断等&#xff09;响应中断 CPU停止执行当前程序&#xff0c;转而去执行中断处理程序&#xff08;ISR&#xff09;…

linux centos7安装colmap

centos安装colmap 一、安装依赖 sudo yum install \gflags-devel \glog-devel \glew-devel \atlas \atlas-devel \lapack-devel \blas-devel \flann-devel \lz4-devel \sqlite-devel \metis-devel \qt5-qtbase-devel二、编译安装colmap git clone https://github.com/colmap/…

WPF的TextBox控件中启用拖放操作

首先&#xff0c;在XAML中为TextBox添加以下属性&#xff1a;AllowDrop"True"。这将启用TextBox的拖放功能。 public MainWindow() {InitializeComponent();textBox.AllowDrop true;textBox.PreviewDragOver TextBox_PreviewDragOver;textBox.PreviewDrop TextBo…

nvm 下载 nodejs 速度慢问题解决

1、找到 nvm 的下载目录&#xff0c;在目录下找到 settings.txt 文件 2、打开 settings.txt 文件 &#xff0c;添加以下代码&#xff1a; node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/添加完成后再去下载即可。

Webpack的入口(entry)和出口(output)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Windows 下编译 TensorFlow 2.9.1 CC库

参考 Intel 的 tensorflow 编译指导&#xff0c;不过项目还是可以用 TF原本的&#xff0c;不是一定要选择Intel 的TF版本。 安装 MSVC 2019 安装 Intel OneDNN OneMKL 似乎也可以不安装 ( & ) https://www.intel.cn/content/www/cn/zh/developer/articles/tool/one…

6 MySQL常用的数据类型

1、整型 -- TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 分别使用 8, 16, 24, 32, 64 位存储空间&#xff0c;一般情况下越小的列越好;2、浮点数 -- 1.FLOAT 和 DOUBLE 为浮点类型&#xff0c;DECIMAL 为高精度小数类型。CPU 原生支持浮点运算&#xff0c;但是不支持 DECIMAl…

Redis主从复制基础概念

Redis主从复制&#xff1a;提高数据可用性和性能的策略 一、概述 Redis主从复制是一种常用的高可用性策略&#xff0c;通过将数据从一个Redis服务器复制到另一个或多个Redis服务器上&#xff0c;以提高数据的可用性和读取性能。当主服务器出现故障时&#xff0c;可以快速地切…

VUE组件间通信的七种方式

目录 1、 props / $emit &#xff08;1&#xff09;父组件向子组件传值&#xff08;props的用法&#xff09; &#xff08;2&#xff09;子组件向父组件传递数据&#xff08;$emit的用法&#xff09; 2、ref / $refs 用法&#xff1a; 3、eventBus事件总线&#xff08;$e…

Technology strategy Pattern 学习笔记1-Context: Architecture and Strategy

Context: Architecture and Strategy 1 Architect and Strategist 1.1 three primary concerns of the architect 1.1.1 Contain entropy(熵-混乱程度&#xff0c;不确定性&#xff0c;惊奇程度&#xff0c;不可预测性&#xff0c;信息量等等&#xff09; The architect wh…

Python|Pyppeteer获取威科先行文章链接(21)

前言 本文是该专栏的第21篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 本文以“威科先行”的信息库为例,笔者将详细介绍使用pyppeteer“自动滑动页面并翻页”获取威科先行的文章链接。如果对pyppeteer的使用以及知识点不太熟悉的同学,可往前查看本专栏前面…

UML 2.0包括14种图

UML 2.0包括14种图&#xff0c;分别如下&#xff1a; &#xff08;1&#xff09;类图&#xff08;class diagram&#xff09;。类图描述一组类、接口、协作和它们之间的关系。类图给出了系统的静态设计视图&#xff0c;活动类的类图给出了系统的静态进程视图。 &#xff08;2…

Modelsim 使用教程(5)——Analyzing Waveforms

一、概述 Wave窗口允许我们以HDL波形和数据的形式查看仿真结果。Wave窗口被划分为多个窗格。通过单击并在任意两个窗格之间拖动该条&#xff0c;可以调整路径名窗格、值窗格和波形窗格的大小。 二、加载一个设计&#xff08;Loading a Design&#xff09; 1、打开modelsim 2、…

SQL左连接实战案例

要求&#xff1a;用表df1和表df2的数据&#xff0c;得到df3 一、创建表 CREATE TABLE df1 (姓名 varchar(255) DEFAULT NULL,年龄 int DEFAULT NULL,部门 varchar(255) DEFAULT NULL,id int DEFAULT NULL );CREATE TABLE df2 (部门 varchar(255) DEFAULT NULL,年龄 int DEFAU…