C++自学笔记23(动态数组和静态数组)

动态数组

C++在std命名空间内给我们提供了一个Vector类,代表了动态数组。原始数组我们在之前笔记中讲过,其大小是我们提前设定好的,动态数组的大小是变化的。

他是怎么做不去规定数组大小的呢?假如你创建存放了5个元素的数组,你想要再加入一些元素,动态数组会将原有五个与新的元素共同复制到新的内存位置,再将原有的五个元素的数组删掉,这就完成了动态数组的工作过程。让我们来看一下如何使用。

#include <iostream>
#include <string>

struct Vectext
{
    float x,y,z;
};

std::ostream& operator<<(std::ostream& stream,const Vectext& vectext)
{
    stram<<vectext.x<<","<<vectext.y<<","vectext.z;
    return stream;
}
int main()
{

    std::cin.get();
}

我们创建Vectext结构体包含xyz,我们对<<进行运算符重载方便代码可读性,更方便打印到控制台。

#include <iostream>
#include <string>
#include <vector>

struct Vectext
{
    float x,y,z;
};

std::ostream& operator<<(std::ostream& stream,const Vectext& vectext)
{
    stram<<vectext.x<<","<<vectext.y<<","vectext.z;
    return stream;
}
int main()
{
    std::vector<Vectext> V;
    std::V.push_back({1,2,3});
    std::V.push_back({4,5,6});
    
    for(i = 0;i<V.size();i++)
        std::cout<<V[i]<<cin.endl;

    std::cin.get();
}

在vector文件下,我们在main函数中创建了V这个动态数组,我们不必对其设定长度。使用std::V.push_back函数向数组内传入123,再传入456。我们循环打印出数组内部数,其中数组长度我们调用size()函数即可。

打印效果

1,2,3

4,  5 ,6

对于循环我们还可以基于range的for循环对其改写

#include <iostream>
#include <string>
#include <vector>

struct Vectext
{
    float x,y,z;
};

std::ostream& operator<<(std::ostream& stream,const Vectext& vectext)
{
    stram<<vectext.x<<","<<vectext.y<<","vectext.z;
    return stream;
}
int main()
{
    std::vector<Vectext> V;
    std::V.push_back({1,2,3});
    std::V.push_back({4,5,6});
    
    for(Vectext& M:V)
        std::cout<<M<<cin.endl;

    std::cin.get();
}

相当于我们将创建的分为两部的V数组全部传给Vectext类的M,直接循环大大减轻代码。(:代表列表初始化,详情查看笔记18

数组清零

int main()
{
    std::vector<Vectext> V;
    std::V.push_back({1,2,3});
    std::V.push_back({4,5,6});
    
    for(Vectext& M:V)
        std::cout<<M<<cin.endl;
    V.clear();
    std::cin.get();
}

clear()函数就清空了数组

删除单个数组元素

int main()
{
    std::vector<Vectext> V;
    std::V.push_back({1,2,3});
    std::V.push_back({4,5,6});
    
    for(Vectext& M:V)
        std::cout<<M<<cin.endl;
    V.erase(V.begin() + 1);
    std::cin.get();
}

erase函数删除,begin()表示第一个元素 +1表示第二个元素。我们删除第二个元素,打印为

1,2,3。(({1,2,3},{4,5,6})一共两个元素)

最后std::vector就是标准模版库中的类,建立动态上数组解决我们手动分配的数组大小,在某些扩展下溢出的情况。具体Vector类对数组的操作,我们自行查看Vector文件定义自行学习。

静态数组

#include <iostream>
#include <array>

int mian ()
{
    std::array<int ,5> data;
    data[0] = 0;
    data[1] = 1;
    
    int data1[5];
    data1[0] = 0;
    data1[1] = 1;

    std::cin.get();
}

在实现上静态数组array与原始数组是一样的,调用std下的array对其传入int型与长度5,命名为data

既然两者一样为什么我们引入静态数组呢?不用管理数组长度,数组长度总是数组的一个障碍点,我们加入、删除都需要人为记得数组长度,数组多了显然有些不方便调试每个长度。

#include <iostream>
#include <array>
void Print(const std::array<int , 5>&,data)
{
    for (i = 0;i<data.size();i++)
        //printf。。。。。
}
int mian ()
{
    std::array<int ,5> data;
    data[0] = 0;
    data[1] = 1;
    
    int data1[5];
    data1[0] = 0;
    data1[1] = 1;

    std::cin.get();
}

在使用循环时候,因为array既是数组又是类,所以们可以调用size()函数知道他的大小以及对其修改的函数。

就我看来静态数组与原始数组的区别就是,静态数组是类可以调用C++自带的函数简便我们维护,并且当数组大小更改时,内部函数用size()可以直接计算新的数组长度不用我们去更改。

动态数组与静态数组有什么差别呢?因为静态数组是优化后的原始数组,所以静态数组也在栈上建立,而动态数组需要自动调节数组长度而建立在堆上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少杰是小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值