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];
}
}
下一篇: C中数据结构单链表的基本操作