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)协议新动向
偶尔分享下程序员梦呓碎碎念(๑•॒̀ ູ॒•́๑)啦啦啦
目前刚刚开通,接受读者的优质投稿…
鉴于国内音视频圈子小,起步晚,以致分享少,门槛高,特开通分享,一起扇动这阵风吧!
微信扫描下方二维码,关注公众号,赶快进入音视频开发者社区吧!