欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++数据结构中的:循序表Vector

程序员文章站 2024-03-06 22:35:02
...

c++数据结构中的:循序表Vector

线性表:分为顺序表和链表
STL(Standard Template Library:标准模板库):
1:Vector:循序表:(内存连续,可以通过下标访问)可以变大小的动态数组
2 List:链表:**(内存不连续,不可以通过下标访问)

3:Vector:添加元素

#include <vector>


	vector<int > vi;
	for (int i = 1; i <= 10; i++)
	{
		vi.push_back(i);
	}

4:删除方法–删除第一个元素和最后一个元素

//删除第一个元素
	vi.erase(vi.begin());//参数:迭代器

	//删除最后一个元素
	vi.pop_back();

5:至少三种方法遍历vector

   //1
	for (int i = 0; i < vi.size(); i++)
	{
		cout << vi[i] << endl;
	}
	//2
	vector<int>::iterator it;
	for (it = vi.begin(); it != vi.end(); it++)
		cout << *it << endl;

	//3
	for (int i = 0; i < vi.size(); i++)
	{
		cout << vi.at(i) << endl;
	}
   //4
	for (int val : vi)
	{
		cout << val << endl;
	}

6:删除所有的偶数

      it = vi.begin();
	 while (it!=vi.end())
	 {
		 if ((*it) % 2 == 0)
		 {
			 it = vi.erase(it);//返回指向下一个元素的迭代器
		 }
		 else
		 {
			 ++it;
		 }

	 }

7:Hero类,定义,添加,删除元素

 //定义存储Hero*类型的vector
	 vector<Hero*> herovi;


	 //添加五个元素,分别指向堆区不同的英雄内存,血量随机0~100
	 for (int i = 1; i <= 5; i++)
	 {
		 Hero* hero = new Hero(rand() %101);//申请堆区Hero的内存
		 herovi.push_back(hero);
	 }

	 vector<Hero*>::iterator heroit;
	 for (heroit = herovi.begin(); heroit != herovi.end(); ++heroit)
	 {
		 if ((*heroit)->getHp() == 0)
		 {
			 delete *heroit;
			 *heroit = nullptr;
			 heroit = herovi.erase(heroit);
		 }
		
	 }

8:重写Vector类
Vector.h

#pragma once

#include<stdio.h>
#include<iostream>
using namespace std;
class Vector
{
public :

	Vector(int count=2);
	~Vector();

	int & operator[](int & index);//重载[]
	Vector&operator=(const Vector& vec);//重载=
	Vector(const Vector& vec);//拷贝构造函数
	void push_back(const int& val);//push_back();//判断是否已满,如果满了,扩容
	void pop_back();//pop_back();//判断是否为空
	int& front();
	int& back();
	const int getsize()
	{
		return size;
	}
	const int getmaxsize()
	{
		return maxSize;
	}
private:
	int* pData;//申请堆区连续内存:首地址
	int size;//容量
	int maxSize;//最大容量
};


Vector.cpp

#include "Vector.h"
Vector::Vector(int count):pData(new int[count]), size(0), maxSize(count)
{

}

Vector::~Vector()
{
	delete[] pData;
	pData = nullptr;
}
//重载下标运算符
int& Vector::operator[](int &index) 
{
	if (index >= 0 && index < size) {
		return pData[index];
	}
	else {
		std::runtime_error err("容器为空,操作异常");
		throw err;
	}
}
//重载赋值运算符
Vector& Vector::operator=(const Vector& vec)
{
	Vector temp(vec);
	return temp;
}

//拷贝构造函数
Vector::Vector(const Vector& vec) 
{
	this->maxSize = vec.maxSize;
	this->size = vec.size;
	pData = new int[maxSize];
	for (int i = 0; i < vec.maxSize; i++) {
		pData[i] = vec.pData[i];
	}
	
}
//	插入一个元素
void Vector::push_back(const int& val)
{
	if (size > maxSize)
	{
		//扩容
		maxSize*=2;
		int *vi = pData;
		pData = new int[maxSize];
		for (int i = 0; i < size; i++)
		{
			pData[i] = vi[i];
		}
		delete vi;
		vi = nullptr;
	}

	pData[size++] = val;
	
}
//移出最后一个元素
void Vector::pop_back()
{
	if (size <= 0)
	{
		std::runtime_error("空");
		std::cout << "pData is null" <<std:: endl;
	}
	else
	{
		pData[--size] = NULL;
	}
	
}
//返回第一个元素
int& Vector::front()
{
	if (size <= 0)
	{
		std::runtime_error error("空");
		throw error;
	}
	else
	{
		return pData[0];
	}
}
//返回最后一个元素
int& Vector::back()
{
	if (size <= 0)
	{
		std::runtime_error error("空");
		throw error;
	}
	else
	{
		return pData[size - 1];
	}
}