首页 > 其他分享 >手撕vector

手撕vector

时间:2024-03-06 10:57:56浏览次数:25  
标签:pVector Vector dwIndex ELE vector DWORD dwLen

Myclass.h

点击查看代码
#pragma once
#include<iostream>
#include<Windows.h>
#define SUCCESS           			 1 // 成功								
#define ERROR            			 -1 // 失败								
#define MALLOC_ERROR			 -2 // 申请内存失败								
#define INDEX_ERROR		 	 -3 // 错误的索引号								


template <class T_ELE>
class Vector
{
public:
	Vector();
	Vector(DWORD dwSize);
	~Vector();
public:
	DWORD	at(DWORD dwIndex, OUT T_ELE* pEle);					//根据给定的索引得到元素				
	DWORD    push_back(T_ELE Element);						//将元素存储到容器最后一个位置				
	BOOL	pop_back();					//删除最后一个元素				
	DWORD	insert(DWORD dwIndex, T_ELE Element);					//向指定位置新增一个元素				
	DWORD	capacity();					//返回在不增容的情况下,还能存储多少元素				
	VOID	clear();					//清空所有元素				
	BOOL	empty();					//判断Vector是否为空 返回true时为空				
	DWORD	erase(DWORD dwIndex);					//删除指定元素				
	DWORD	size();					//返回Vector元素数量的大小				
private:
	BOOL	expand();
private:
	DWORD  m_dwIndex;						//下一个可用索引				
	DWORD  m_dwIncrement;						//每次增容的大小				
	DWORD  m_dwLen;						//当前容器的长度				
	DWORD  m_dwInitSize;						//默认初始化大小				
	T_ELE* m_pVector;						//容器指针				
};

//构造函数(不带参数)
template <class T_ELE>
Vector<T_ELE>::Vector()
	:m_dwInitSize(10), m_dwIncrement(5)
{
	//1.创建长度为m_dwInitSize个T_ELE对象		
	m_pVector = new T_ELE[m_dwInitSize];

	//2.将新创建的空间初始化	
	memset(m_pVector, 0, m_dwInitSize * sizeof(T_ELE));

	//3.设置其他值	
	m_dwLen = m_dwInitSize;
	m_dwIndex = 0;

}

//构造函数(带参数)
template <class T_ELE>
Vector<T_ELE>::Vector(DWORD dwSize)
	:m_dwIncrement(5)
{
	//1.创建长度为dwSize个T_ELE对象										
	m_pVector = new T_ELE[dwSize];

	//2.将新创建的空间初始化
	memset(m_pVector, 0, dwSize * sizeof(T_ELE));

	//3.设置其他值	
	m_dwLen = dwSize;
	m_dwIndex = 0;
}

//析构函数
template <class T_ELE>
Vector<T_ELE>::~Vector()
{

	//释放空间 delete[]										
	delete[] m_pVector;
	m_pVector = NULL; 
}


template <class T_ELE>
BOOL Vector<T_ELE>::expand()
{
	DWORD dwTempLen = 0;
	T_ELE* pTemp = NULL;
	// 1. 计算增加后的长度										
	dwTempLen = m_dwLen + m_dwIncrement;

	// 2. 申请空间										
	pTemp = new T_ELE[dwTempLen];

	// 3. 将数据复制到新的空间										
	memcpy(pTemp,m_pVector,sizeof(T_ELE)*m_dwLen);

	// 4. 释放原来空间										
	delete[] m_pVector;
	m_pVector = pTemp;
	pTemp = NULL;

	// 5. 为各种属性赋值	
	m_dwLen = dwTempLen;

	return TRUE; 

}

//将元素存储到容器最后一个位置	
template <class T_ELE>
DWORD Vector<T_ELE>::push_back(T_ELE Element)
{
	//1.判断是否需要增容,如果需要就调用增容的函数										
	if (m_dwIndex >= m_dwLen) 
	{
		expand();
	}
	//2.将新的元素复制到容器的最后一个位置										
	memcpy(&m_pVector[m_dwIndex],&Element,sizeof(T_ELE));
	//3.修改属性值
	m_dwIndex++;

	return SUCCESS;
}

//删除最后一个元素
template<class T_ELE>
BOOL Vector<T_ELE>::pop_back() {
	/*if (m_dwLen > 0) {
	memset(m_pVector + m_dwLen, 0, sizeof(T_ele));
	m_dwLen--;
	}
	*/
	//下面这个是删除当前元素中最后一个元素的方法,上面注释那个是删除整个容器最后一个容器
	if (m_dwIndex > 0) {
		memset(m_pVector + (m_dwIndex - 1), 0, sizeof(T_ELE));
		m_dwIndex--;
		return TRUE;
	}
}

//向指定位置新增一个元素
template <class T_ELE>
DWORD Vector<T_ELE>::insert(DWORD dwIndex, T_ELE Element)
{
	//1.判断索引是否在合理区间	
	if(dwIndex<0|| dwIndex>m_dwIndex)
	{
		return INDEX_ERROR;
	}
	
	//2.判断是否需要增容,如果需要就调用增容的函数										
	if(dwIndex>=m_dwLen)
	{
		expand();
	}

	//3.将dwIndex只后的元素后移										
	for(int i = m_dwIndex;i> dwIndex;i--)
	{
		memcpy(&m_pVector[i], &m_dwIndex[i - 1], sizeof(T_ELE));
	}

	//4.将Element元素复制到dwIndex位置										
	memcpy(&m_dwIndex[dwIndex],&Element,sizeof(T_ELE));

	//5.修改属性值
	m_dwIndex++;
}

//根据给定的索引得到元素
template <class T_ELE>
DWORD Vector<T_ELE>::at(DWORD dwIndex, T_ELE* pEle)
{
	//判断索引是否在合理区间										
	if (dwIndex<0 || dwIndex>=m_dwIndex) 
	{
		return INDEX_ERROR;
	}

	//将dwIndex的值复制到pEle指定的内存
	memcpy(&pEle, &m_pVector[dwIndex],  sizeof(T_ELE));
}

//删除指定元素
template <class T_ELE>
DWORD Vector<T_ELE>::erase(DWORD dwIndex)
{
	//1.判断索引是否在合理区间	
	if (dwIndex <0 || dwIndex >= m_dwIndex || dwIndex > m_dwLen)
	{
		return INDEX_ERROR;
	}

	//2.将dwindex之后的元素前移	
	for (int i = dwIndex; i < m_dwIndex - 1; i++)
	{
		memcpy(&m_pVector[i], &m_pVector[i + 1], sizeof(T_ELE));
	}

	//3.修改属性值
	m_dwIndex--;
}

//判断Vector是否为空 返回true时为空	
template<class T_ELE>
BOOL Vector<T_ELE>::empty() {
	if (m_pVector == NULL or m_dwIndex = 0) {
		return true;
	}
	return false;
}

template<class T_ELE>
DWORD Vector<T_ELE>::size() {
	return m_dwLen;
}

//查询剩余容量
template<class T_ELE>
DWORD Vector<T_ELE>::capacity() {
	if (m_pVector)
	{
		return m_dwLen - m_dwIndex;
	}
	return ERROR;
}


template<class T_ELE>
void Vector<T_ELE>::clear() {
	memset(m_pVector, 0, sizeof(T_ELE) * m_dwLen);
	m_dwIndex = 0;
}




Vector.cpp

点击查看代码
#include"MyClass.h"
#include"malloc.h"

void TestVector()
{
	Vector<int>* pVector = new Vector<int>(5);

	pVector->push_back(1);
	pVector->push_back(2); 
	pVector->push_back(3); 
	pVector->push_back(4); 
	pVector->push_back(5); 
	//pVector->push_back(6); 

	pVector->erase(3);

}

int main(int argc, char* argv[]) 
{ 
	TestVector();

	return 0;
}

标签:pVector,Vector,dwIndex,ELE,vector,DWORD,dwLen
From: https://www.cnblogs.com/h40fei/p/18056026

相关文章

  • C++ 释放vector内存
    释放vector内存的方法有多种,具体取决于使用vector的方式以及释放内存的目的。下面列举几种常见的释放vector内存的方法:1、清空vector调用vector的clear()方法可以清空vector中的元素,但是并不会释放vector所占用的内存空间。这意味着,如果之后还需要往vector中添加元素,ve......
  • C++ 如何快速清空vector以及释放vector内存?
    1、为什么需要主动释放vector内存vector其中一个特点:内存空间只会增长,不会减小,援引C++Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元......
  • Qt QVector数据清理和内存清理
    原因在处理大数据时,发现QVector直接用clear后台查看程序所占用的内存并没有下降QVector数据清理1QVector<int>example_vec;2example_vec.clear();QVector内存清理1QVector<int>example_vec;2example_vec.shrink_to_fit();//程序运行到此处时内存才被降下去QV......
  • 可恶的vector
    前言当你使用了\(vector\)你一定觉得这是一个非常实用,非常好用的数据结构。当你这样想的时候,你就陷入了\(vector\)的圈套。正文注意事项vector的定义与赋值操作当你定义了一个指定大小的\(vector\),如:vectorv(N)此时容器中的所有元素都被赋值为\(0\)。如果你使用了v.push_ba......
  • 37vector容器与API
    vector容器与API#include<iostream>#include<vector>usingnamespacestd;/*vector容器:向量容器底层数据结构:动态开辟的数组,每次以原来空间2倍进行扩容vector<int>vec;增加:vec.push_back(20);末尾添加元素O(1)导致容器扩容vec.insert(it,20);it迭代器指向的位......
  • 39vector, deque, list之间的对比
    vector,deque,list之间的对比vector的特点:动态数组内存是完全连续的扩容:2倍形式扩容,扩容时要开辟新的内存空间,并将数据拷贝list的特点:双向循环链表内存是不连续的没有扩容需求deque的特点:参考动态开辟的二维数组空间内存分段连续第二维是固定长度的数组......
  • [详解-vector] C++必知必会 vector常用各种操作解析
    原文转载自知乎:https://zhuanlan.zhihu.com/p/648650828vector是C++标准库中的一个动态数组容器,它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小。它是一个非常常用且强大的容器,用于存储一系列元素。下面详细介绍vector的使用方法,并提供相应的代码案例。1.包含......
  • c++复习笔记——STL(vector)
    c++-----STL容器系列(1)vector1介绍Vector是stl容器中一种常见的容器,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vector预定值时vector将自动扩容。Vector是一种顺序存储器,在内存中连续排列,可以通过下标访问,时间复杂度为O(1)。2创建和使用使用......
  • vector
    vector的定义和特征动态数组容器存储一系列相同类型的元素标准库<vector>中定义的模板类声明加头文件<vector>vector<T>vec;T☞元素类型容器大小:动态数组可以自己调节元素访问:通过索引来访问vector中的元素,索引从0开始,到size()-1.可以使用[]运算符或at()函数来......
  • vector用法
    1.vector的构造函数函数原型:1.vector<T>v;//使用模板类,默认构造函数2.vector(v.begin(),v.end());//将[v.begin(),v.end())区间中的元素拷贝给本身3.vextor(n,elem);//将n个elem拷贝给本身4.vector(constvector&v);//拷贝构造函数2.vector的赋值操作函数原型:1.vector&o......