动态数组C++实现

vector是用动态数组实现的,所谓动态是指当存储在数组中的元素个数接近数组的容量时,vector机制会另外malloc一片空间,此空间的大小是原空间的两倍,然后再将原空间的数据复制过来,最后将原空间释放,这就是vector全部的机制。具体实现是结构体加上一些维护这些结构体的接口。

以下实现方式是STL中的vector实现方式。

serverExe : try_Vector_main.o try_Vector.o
	g++ -o Exe try_Vector_main.o try_Vector.o
main.o : try_Vector_main.cpp try_Vector.h
	g++ -g -c try_Vector_main.cpp
solution.o : try_Vector.h try_Vector.cpp
	g++ -g -c try_Vector.cpp
clean :
	rm try_Vector_main.o try_Vector.o Exe
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;



//vector与c的数组的区别仅在空间不用自动分配,其他相同
//标准库小写vector
class try_Vector
{
    public:
    try_Vector();
    ~try_Vector();
    //增
    void insert(int pos, int value);
    //尾插
    void push_back(int value);
    //删
    void pop();
    //根据位置删除
    void delete_by_pos(int pos);
    //根据值删除
    void delete_by_value(int value);
    //根据位置查找 值
    int find_by_pos(int pos);
    //查 根据值查找 位置
    int find_by_value(int value);
    //清空
    void clear();
    //获得数组容量
    int capacity();
    //显示当前元素个数
    int size();
    //扩容
    void expand_capacity();
    //打印
    void print_int();
    

    typedef struct Data
    {
        int* int_prt = NULL;
        int size = 66;
        int capacity =88; //try初始化 如果定义此结构体指针的化尽量不要赋初值,可能会引起段错误
    }DATA;
    DATA* data_bag = NULL;

};
#include "try_Vector.h"


try_Vector::try_Vector()
  {

      //申请空间
     data_bag = (DATA*)malloc(sizeof(DATA));
     data_bag->capacity = 4;
     data_bag->int_prt = (int*)malloc(sizeof(int) *                  data_bag->capacity); //sizeof是关键字,可以用类型作为参数 返回值是字节
        data_bag->size = 0;
         //try初始化
    }

    try_Vector::~try_Vector() //~是名字的一部分
    {
        // free(data_bag->int_prt);
        // data_bag->int_prt = NULL;
        // data_bag->size = 0;
        // data_bag->capacity = 0;
        // free(data_bag);
    }
//增
void try_Vector::insert(int pos, int value)
{
    //判断容量
    if(this->data_bag->size == this->data_bag->capacity)
    {
        expand_capacity();
    }
    int* int_prt_next = (int*)malloc(sizeof(int) * this->data_bag->capacity);
    for(int i = 0, j = 0; i < this->data_bag->size; i++, j++)
    {
        if(i == pos)
        {
            int_prt_next[i] = value;
            i++;
        }
        int_prt_next[i] = this->data_bag->int_prt[j];
    }
    data_bag->int_prt = int_prt_next;
    this->data_bag->size++;
}

//尾插
void try_Vector::push_back(int value)
{
    //扩容
    // cout
    if(this->data_bag->size == this->data_bag->capacity)
    {
        expand_capacity();
    }
    //插入
    data_bag->int_prt[data_bag->size] = value;
    data_bag->size++; 
}

//删
void try_Vector::pop()
{
    this->data_bag->size--;
}

//根据位置删除
void try_Vector::delete_by_pos(int pos) //这个位置为[pos]
{
    if(pos + 1 > this->data_bag->size)
    {
        cout << "___访问越界___" << endl;
        return ;
    }
    for(int i = pos; i + 1 < this->data_bag->size; i++)
    {
        this->data_bag->int_prt[i] = this->data_bag->int_prt[i + 1];
    }
    this->data_bag->size--;
}

//根据值删除
void try_Vector::delete_by_value(int value)
{
    for(int i = 0; i < this->data_bag->size; i++)
    {
        if(this->data_bag->int_prt[i] == value)
        {
            delete_by_pos(i);
            break;
        }
    }
}

//根据位置查找
int try_Vector::find_by_pos(int pos)
{
    if(pos + 1 > this->data_bag->size)
    {
        cout << "__访问越界__" << endl;
        return 0;
    }
    return this->data_bag->int_prt[pos];
}

//根据值查找 位置
int try_Vector::find_by_value(int value)
{
    for(int i = 0; i < this->data_bag->size; i++)
    {
        if(this->data_bag->int_prt[i] == value)
        {
            return i;
        }
    }
    cout << "__vector中不含有此值__" << endl;
    return 0;
}

//清空
void try_Vector::clear()
{
    this->data_bag->size = 0;
}

//扩容
void try_Vector::expand_capacity()
{
    int *int_prt_next = (int*)malloc(sizeof(int) * this->data_bag->capacity * 2);
    this->data_bag->capacity *= 2;
    for (int i = 0; i < this->data_bag->size; i++)
    {
        int_prt_next[i] = this->data_bag->int_prt[i];
    }
    void* temp_prt = this->data_bag->int_prt;
    this->data_bag->int_prt = int_prt_next;
    free (temp_prt); //malloc free是函数 new delete是关键字
}

//获得数组容量
int try_Vector::capacity()
{
    return this->data_bag->capacity;
}

//显示当前元素个数
int try_Vector::size()
{
    return this->data_bag->size;
}

//打印
void try_Vector::print_int()
{
    if(this->data_bag->size == 0)
    {
        cout << "___vector无元素___" << endl;
    }
    for(int i = 0; i < this->data_bag->size; i++)
    {
        cout << i << " : " << this->data_bag->int_prt[i] << endl;
    }
    
}
#include <iostream>
#include <string>
#include "try_Vector.h"
using namespace std;


int main(void)
{
    try_Vector try_vector;
    cout << "capacity(5) : " << try_vector.capacity() << endl;
    try_vector.push_back(0);
    try_vector.push_back(1);
    try_vector.push_back(2);
    cout << "size(5) : " << try_vector.size() << endl;
    try_vector.push_back(3);
    try_vector.push_back(4);
    try_vector.push_back(5);
    try_vector.print_int();
    try_vector.pop();
    cout << "size(5) : " << try_vector.size() << endl;
    cout << "find_by_pos(1) : " << try_vector.find_by_pos(1) << endl;
    cout << "find_by_value(2) : " << try_vector.find_by_pos(2) << endl;
    cout << "capacity(5) : " << try_vector.capacity() << endl;
    try_vector.delete_by_pos(4);
    try_vector.delete_by_value(3);
    try_vector.print_int();
    try_vector.clear();


    cout << "________________" << endl;
    // try_vector.insert(5, 8);
    // try_vector.print_int();
    return 0;
}

哎呦喂ヾ(✿゚▽゚)ノ~路长馆小,雪轻帘薄,酒热乎,这位爷~您ヾ(✿゚▽゚)ノ~ 里面坐~
本公众号专注分享C++,ffmpeg,opencv等相关音视频知识
webrtc,udp,tcp,rtsp,rtmp,srt/nginx+rtmp等流媒体协议和服务器
同时也会有大厂音视频技术专家不定期直播分享…
国人开发流媒体srs服务器,及yangrtc(国人版的webrtc)协议新动向
偶尔分享下程序员梦呓碎碎念(๑•॒̀ ູ॒•́๑)啦啦啦
目前刚刚开通,接受读者的优质投稿…
鉴于国内音视频圈子小,起步晚,以致分享少,门槛高,特开通分享,一起扇动这阵风吧!
微信扫描下方二维码,关注公众号,赶快进入音视频开发者社区吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

、、、、南山小雨、、、、

分享对你有帮助,打赏一下吧!

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

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

打赏作者

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

抵扣说明:

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

余额充值