C++动态数组vector实现

c++中的vector动态数组 vector可以简单理解为STL(标准模版库)提供的功能强大的动态数组vector不只是用来储存整型、浮点型等数字,还可以储存字符、字符串、结构体甚至是类等等。vector可以存储一系列类型相同的元素,因此,称vector动态系列容器更加合适。提示:以下是本篇文章正文内容,下面案例可供参考以上就是vector容器的介绍以及一些简单的使用方法了,如要更深入了解vector类,可以参考《C_Primer_Plus_第六版》 阅读详情

最近在做将MATLAB代码转化为C/C++的工作,在实际应用时,发现动态数组非常重要,我在学习的时候也踩了许多坑,这篇就当做一篇踩坑笔记,希望读者能够绕开我踩过的坑,顺利应用动态数组。

1.静态数组、动态数组

其实在C语言中,都是静态数组,即需要在定义的时候就定下该数组的长度,然而这在实际的应用中,很大的一部分情况是我们并不知道数组的长度,因此没有办法声明长度。此时我们就需要应用可以自动扩容的动态数组啦!
动态数组,它与静态数组的最大区别是在定义的时候你可以不需要知道此时你定义的这个数组的具体长度,在你为该数组赋值时,如果存储空间不够,它会自动扩容,也就是不需要担心长度不够,数组溢出啦。

2.vector定义一维动态数组

一开始,我选用过用new来定义一个动态数组,但是这种定义方式不是很方便,赋值很繁琐,并且在使用过后你需要自己手动的去释放内存,这对于懒懒的并且记性不好的我非常不友好。在我广泛查阅资料后,我知道了vector这种方法,该方法简单易上手,主要是不用手动释放内存,就是效率有些低,但是总体来说用vector定义动态数组还是非常值得一试的!

(1)声明
在你要使用vector这个容器时,你需要在代码开头的部分进行声明,代码如下:

#include<vector>
using namespace std;

(2)用vector定义一个一维数组
请看下面语句:

vector <int> n;

在这句代码中,我利用vector定义了一个动态数组,名称是 n ,这个数组中存储的数据类型是int型。并不需要在此处指定数组的大小。
vector定义数组非常灵活,这里的数据类型不仅仅局限于int,double这种基本的数据类型,这里甚至可以使结构。

(3)vector一维数组的赋值
一般情况vector动态数组都是利用for循环进行复制的。
例子:

vector <int> n;
int i;
for (i = 0; i<ALL_Length; i++) //其中ALL_Length可以是一个常数,也可以是变量,例如其他已经有值的动态数组长度
 {
  n.push_back(0);
 }

注意(新手常见错误):
① 使用 push_back 对动态数组进行初次赋值!
很多人在一开始的时候可能会这样赋值 n[i] = x[j],这里 n 和 x 都是一个一维数组,是想将 x 数组中的第 j 个值赋给 n 数组的第 i 个值。这个操作看似没什么问题,但是在debug的时候回出错。错误的原因是在用vector定义了一个移位数组时,这个数组是空的,因此就没有下标,所以不能直接对下标进行操作,要使用 push_back ,将要输入的值一个一个按照次序输入进去,就可以将代码改写为n.push_back(x[j]);

② 创建的动态数组的长度问题
请看下面一段代码:

//此段代码存在问题,是典型的反例
vector <int> n;
int len_n = n.size();
int i;
for (i = 0; i<len_n; i++) //其中ALL_Length可以是一个常数,也可以是变量,例如其他已经有值的动态数组长度
 {
  n.push_back(0);
 }

此段代码与上面赋值的代码大致相同,只是该段代码在用vector定义了一个动态数组 n 后,int len_n = n.size(); ,这行代码本身是没有任何语法错误的,但是它出现的位置缺不对。
在你用vector定义了一个动态数组后,紧接着就来了一句取数组长度的语句,请注意!此时你是定义了一个数组,但是你还没有给它传值,因此,此时你取到的数组长度是 0 !所以后续你想要用这个长度作为范围来进行数组赋值就会出错,因为范围是0,所以根本这个循环就没有进去,所以到时赋值失败!

3.vector定义二维数组

具体定义形式如下:

 vector <vector <double> > m(8);

此时我定义了一个8行未知列数的矩阵,该矩阵的赋值与一维的情形类似,只是用了两层for循环。

4.vector动态数组的一些操作

(1) n[i] //返回n的第i个值
(2) n.size(); //取数组长度
(3) n.push_back(); //存数据
(4) n.pop_back(); //删除最后一个数据
(5) n.assign(x.begin(),x.end()); //将数组x的值赋给n,x.begin()是去x的首地址,x.end()是去x 的尾地址。

C++中将vector转化为动态数组&实现快速排序 STL中的vector相比传统的数组构造方法效率较低但使用起来更方便,尤其在动态数组方面,可以在不知道数组大小的情况下动态地创建所需要的vector,在C++中这是其他所有构造数组的方法都不具备的,但当需要使用vector时却发现只是遍历比较方便,而往往现成的算法形参都需要传入数组或者指向数组首元素的指针,这时就经常需要将vector转换为数组,所以写一个简单的vec2arr模板函数以后方便调用并 阅读详情

相关推荐

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

此外,动态数组的内存大小必须在运行时明确定义,并且需要手动处理分配和释放内存,这可能会引入错误,因此要特别小心。的底层实现是基于动态分配的数组,它使用内部指针来管理内存,并提供了各种方法来操作容器中的元素,包括插入、删除、访问等。是标准库中的一个动态数组容器,它提供了动态大小的数组,类似于C数组,但它具有自动管理内存的功能,可以动态增加或减少数组的大小。,它是一个动态数组的封装,提供了更方便和安全的方法来管理动态数组。的底层实现通常是使用动态分配的数组,以及一些成员函数来管理这个数组的大小和元素。

小勇博客 878

C++ STL之 vector动态数组)详解

vector为可变长数组动态数组),定义的vector数组可以随时添加数值和删除元素。在局部函数中开vector数组,是在堆空间里面开的,与开全局变量比较类似,所以经常见到在局部函数中开大容量数组。1.头文件2.初始化一维初始化//定义了一个名为num的存int数据的一维数组//定义了一个名为num的存double数据的一维数组//node是结构体类型1.指定长度和初始值的初始化//定义一个长度为n的数组动态定义,不指定初值默认初值为0//所有的元素均为0。

zdlzf的博客 7004

vector容器实现原理】——C++动态数组的优秀选择

需要注意的是,vector容器的构造函数不仅可以接受单个数据元素作为初始化参数,还可以接受多个数据元素或另一个vector容器对象作为参数,用于快速初始化vector容器中的元素。需要注意的是,在vector容器存储元素时,其内部实际上分配了比实际使用的内存空间更大的一块连续内存,以便后续插入新元素时能够避免频繁的扩容操作。在C++中,vector容器是一个非常常用的数据结构,其以动态数组的形式封装了许多操作函数,使得我们可以方便地进行数组元素的增删改查。下面,我们来看一下vector容器的构造函数实现

PixelShadeZ的博客 122

c++ vector (一维,二维的初始)使用

c++ vector (一维,二维的初始)使用 初始 插入 删除 等常用操作及注意事项 非常适合新手小白

qq_68004012的博客 1174

C++ Vector (动态数组)

简介 向量(Vector)是一个封装了动态大小数组的顺序容器。 向量是一个能够存放任意类型的动态数组C++Vector 的使用 头文件 #include <vector> 需要使用 std 命名空间 using namespace std; ...

果光的博客 6522

C++ 动态数组 vector

C++ vector 使用方法

X0_0K的博客 2066

C++vector 类模拟实现:探索动态数组的奥秘

本文围绕 C++vector 类的模拟实现展开。首先在引言中强调其重要性并引发探索兴趣。接着分析 vector 类功能需求,涵盖存储、访问修改、数量操作、迭代器支持与内存管理等方面。然后详细阐述模拟实现步骤及代码,包括类定义、多种构造函数、析构函数、各功能函数(如获取数量容量、预留调整大小、下标操作符重载、赋值、添加删除元素、迭代器相关)。还给出示例用法展示各类操作的实际应用,最后总结模拟实现的意义,并通过投票环节收集读者对文章内容理解及后续期望等方面的反馈。

A Charmer 的博客 1813

C++篇】揭秘STL vector:高效动态数组的深度解析(从使用到模拟实现

本文详细介绍了C++vector的使用及其底层实现,重点讲解了vector的常用接口、内存管理以及模拟实现中的常见问题。文章首先介绍了vector的基本概念和特性,包括其动态数组的特性、内存分配策略以及与其他容器的比较。接着,详细讲解了vector的构造函数、迭代器、容量管理、增删查改等常用接口的使用方法,并提供了代码示例。 在模拟实现部分,文章深入剖析了vector的底层实现,重点讨论了reserve函数中的浅拷贝问题,并提供了解决方案。通过分析memcpy在自定义类型中的局限性,文章指出使用赋值重载可

Surplus886的博客 1221

C++ vector动态扩容及动态数组C语言实现

是stl中的动态数组,支持动态扩容,stl是如何进行动态扩容的呢?了解其动态扩容过程有什么用?

大脑白质的博客 948

19. C++STL 5(深入理解vectorvector的模拟实现,二维动态数组)

C++STL中vector的深入理解和模拟使用,使用vector定义二维数组

yzc的博客 1103

C++实现vector动态数组

【代码】C++实现vector动态数组

weixin_42936764的博客 201

学习C++ -> 向量(vector) 实现动态二维数组

原文链接(vector基础知识介绍) vector实现动态二维数组 一、向量的介绍 向量vector是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 可以广义上认为是数组的增强版。 在使用它时, 需要...

Find的博客 1万+

C++ vector 实现动态大小的二维数组

      为什么会写这个文章呢?是因为最近做一个opencv相关的项目,涉及到存储像素坐标,但是我并不知道像素的数量,所以想建立一个二维数组动态存储像素的x,y坐标。由书上的知识可知,C++中的二维数组实质上是一维数组里存储的元素仍然是一维数组,而且在定义的时候必须指定数组的大小,很显然无法满足我们的需要。      经过查找网上的资料,发现还有一种方法是利用new运算符建立动态数组,但是并不...

SUJI的博客 1万+

C++实现Vector动态数组

#include <iostream> #include <string> #include <ctime> /* 构造函数:定义对象(分配内存,构造函数)构造函数完了,对象就产生了 析构函数:对象内存释放之前 栈 堆delete .data析构函数完了 -对象销毁 对象的册灰姑娘元变量占用外部资源的时候,需要重写下面俩个函数,防止对象的浅拷贝问...

GoingJack博客 801

c++篇】:深入剖析vector--模拟实现属于自己的c++动态数组

C++的世界中,标准模板库(STL)的vector容器因其灵活性和效率而广受欢迎。vector以其动态数组的形式,提供了快速访问和插入元素的能力,是许多程序员的得力工具。然而,当我们深入探究其内部机制时,会发现实现一个高效、健壮的vector并非易事。在这篇博客中,我们将一起踏上模拟实现vector的旅程。我们将从零开始,一步步构建一个属于我们自己的vector类。我们将探索vector的内部结构,理解其内存管理策略,并实现其核心功能,如push_backpop_backinsert和erase等操作。

2301_82347435的博客 2695

C++ vector实战:从矩阵乘法题解析动态数组与算法实现

C++编程中,动态数组是处理可变规模数据的基础数据结构,其核心价值在于提供灵活的内存管理和高效的随机访问能力。vector作为STL中最常用的动态数组容器,通过自动内存分配与释放,有效避免了原生数组的固定大小限制和手动内存管理的复杂性。从技术原理看,vector在内存中以连续块存储元素,这不仅保证了O(1)时间复杂度的索引访问,还通过预留空间和动态扩容机制平衡了性能与灵活性。在算法与工程实践中,vector常用于实现矩阵运算、图的邻接表存储以及动态规划中的状态表,是连接数学抽象与代码实现的关键桥梁。本文以

weixin_31742871的博客 276

C++:使用Vector实现动态数组——算法中的常用数据结构

Vector是STL提供的动态数组容器,能够根据需要在运行时改变数组大小。它以数组形式存储元素,并具有连续的内存空间,因此可以在常数时间内完成索引操作。vector作为一个模板类,可以存储任何其他类的对象,记得需要修改模板类的类型为对应类型例如,可以申请类型用于存储二叉树,便于解决很多问题int x , y;除了一维数组,还可以定义多维数组,例如二维数组用于实现图的邻接表存储。空向量检查:在删除最后一个元素之前,要确保vector不为空。可以使用empty()函数检查vector

qq_34110689的博客 1619

java动态数组vector,C++ Vector 动态数组实现

简介向量(Vector)是一个封装了动态大小数组的顺序容器。向量是一个能够存放任意类型的动态数组C++Vector 的使用头文件 #include 需要使用 std 命名空间 using namespace std;以下使用方法以 int 数据类型为例,使用时可自定义数据类型注意:下文中区间为左闭右开1. 定义(初始化)Vectorvector v; 创建一个空vectorvector v...

weixin_28856787的博客 443
上一篇: C语言实现MATLAB中的rectpulse函数(含代码)
下一篇: 算法笔记:二叉树,二叉搜索树笔记(python)
yangbupang
博客等级 码龄8年 23粉丝 15原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值