手写线性表C++ vector

news2024/11/19 23:20:51

目录

一、vector基本概念

1.1、构造函数

1.2、析构函数

1.3、插入元素

1.4、删除元素

1.5、重载运算符

二、完整代码


一、vector基本概念

C++中的vector是一种动态数组,它可以根据需要自动调整大小。vector是C++标准模板库(STL)中的一个容器,它可以存储任意类型的元素,如整数、浮点数、字符串等。使用vector时,不需要关心数组的大小,因为它会自动管理内存。

vector的基本操作包括添加元素、删除元素、访问元素等。例如,可以使用push_back()函数向vector末尾添加元素,使用pop_back()函数删除vector末尾的元素,使用下标访问元素等。此外,vector还支持迭代器,可以方便地遍历vector中的所有元素。

vector的优点包括:

  1. 动态调整大小,不需要预先分配固定大小的内存;
  2. 支持随机访问,访问速度较快;
  3. 提供了丰富的成员函数,方便操作。

然而,vector的缺点是插入和删除元素的效率较低,因为可能需要移动大量元素来重新排列。在需要频繁插入和删除元素的场景下,可以考虑使用其他容器,如list。C++ STL中已经有了vector,其底层数据结构就是线性表,你可以理解为:动态数组,他在内存中存储是连续的,而链表就不是线性的。本文使用c++自定义个MyVector类。

1.1、构造函数

MyVector类需要维护三个成员:

  •     int* array_:假定这是一个int型动态数组
  •     int size_:表示当前数组中已经塞进去几个元素
  •     int capacity_:表示当前数组最多能塞进几个元素,如果容量不够,还要扩容,后面会讲,注:size_ <= capacity_
MyVector::MyVector()
{
    size_ = 0;
    capacity_ = 10;
    array_ = new int[capacity_];
}

1.2、析构函数

没什么特别的地方,就是delete[]成员array_就行。

MyVector::~MyVector()
{
    delete[] array_;
    cout << "free " << array_ << endl;
}

1.3、插入元素

实现一个push_back方法,和std::vector一样的。插入元素的时候,要判断容量是否用完;如果空间不够,那就申请一块更大的空间,再将原来的数据拷贝过来,然后释放原来的数据,最后插入新的元素。所以,这里应该知道,std::vector是的使用的时候,最好能够预留好(reserve)合适的空间。

void MyVector::push_back(int value)
{
    if (empty()) return;
    //判断空间是否足够
    if (size_ == capacity_)
    {
        int* newspace = new int[capacity_ * 2]; // 扩容
        memcpy(newspace, array_, capacity_ * sizeof(int));// 备份 - > newsapce
        delete[] array_;// 删除旧空间
        capacity_ *= 2;//扩容
        array_ = newspace;//转移旧空间的值 - > 新空间
    }
    //在末尾插入元素
    array_[size_] = value;
    size_++;
}

1.4、删除元素

给定需要删除元素的索引pos或者value,就能删除元素。C++ STL中的std::vector删除元素和这里一样,都会涉及拷贝数据。

依据索引pos删除元素:

void MyVector::removeByPose(int pos)
{
    if (empty()) return;
    if (pos < 0 || pos >= size_)//越界
    {
        cout << "out of range!" << endl;
        return;
    }
    for (int i = pos; i < (size_ - 1); i++) //注意越界
    {
        array_[i] = array_[i + 1];
    }
    size_--;
}

依据索引值value删除元素:

void MyVector::removeByValue(int value)
{
    if (empty()) return;
    int pos = find(value);
    if (pos == -1)
    {
        cout << "没有元素:" << value << endl;
        return;
    }
    removeByPose(pos);
}

1.5、重载运算符

这样就可以直接使用下标直接访问元素。

    int& operator[](int index)// 可以是返回引用
    {
        return array_[index];
    }

二、完整代码

vector的优点:访问任何一个元素,直接使用下表就行,例如arr[2],速度很快。缺点:删除元素性能开销大。以下给出完整代码:

#include<iostream>

using namespace std;

class MyVector
{
public:
    MyVector();
    ~MyVector();
    void push_back(int value);
    void removeByPose(int pos);
    void removeByValue(int value);
    int find(int value);
    int& operator[](int index)// 可以是返回引用
    {
        return array_[index];
    }
    void show() const;
    void clear()
    {
        size_ = 0;
    }
    bool empty()
    {
        if (array_ == nullptr)
            return true;
        else
            return false;
    }
public:
    int* array_;
    int size_;
    int capacity_;
};
MyVector::MyVector()
{
    size_ = 0;
    capacity_ = 10;
    array_ = new int[capacity_];
}
MyVector::~MyVector()
{
    delete[] array_;
    cout << "free " << array_ << endl;
}
void MyVector::push_back(int value)
{
    if (empty()) return;
    //判断空间是否足够
    if (size_ == capacity_)
    {
        int* newspace = new int[capacity_ * 2]; // 扩容
        memcpy(newspace, array_, capacity_ * sizeof(int));// 备份 - > newsapce
        delete[] array_;// 删除旧空间
        capacity_ *= 2;//扩容
        array_ = newspace;//转移旧空间的值 - > 新空间
    }
    //在末尾插入元素
    array_[size_] = value;
    size_++;
}
void MyVector::show() const
{
    cout << "size_ = " << size_ << " ||";
    for (int i = 0; i < size_; i++)
    {
        cout << array_[i] << " ";
    }
    cout << endl;
}
void MyVector::removeByPose(int pos)
{
    if (empty()) return;
    if (pos < 0 || pos >= size_)//越界
    {
        cout << "out of range!" << endl;
        return;
    }
    for (int i = pos; i < (size_ - 1); i++) //注意越界
    {
        array_[i] = array_[i + 1];
    }
    size_--;
}
int MyVector::find(int value)
{
    if (empty()) return -1;
    int pos = -1;
    for (int i = 0; i < size_; i++)
    {
        if (array_[i] == value)
        {
            pos = i;
            break;
        }
    }
    return pos;
}
void MyVector::removeByValue(int value)
{
    if (empty()) return;
    int pos = find(value);
    if (pos == -1)
    {
        cout << "没有元素:" << value << endl;
        return;
    }
    removeByPose(pos);
}
int main()
{
    MyVector vec;
    for (int i = 0; i < 12; i++)
    {
        vec.push_back(i * i);
    }
    vec.push_back(88);
    vec.show();
    vec.removeByPose(1);
    vec.show();
    vec.removeByPose(2);
    vec.show();
    vec.removeByValue(49);
    vec.show();
    int position = vec.find(25);
    //测试重载
    cout << "test for overload " << endl;
    for (int i = 0; i < vec.size_; i++)
    {
        cout << vec[i] << " ";
    }
    cout << endl;
    vec.clear();
    vec.show();
    return 1;
}

下图是执行效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1204266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通信原理板块——线性分组码之汉明码

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、汉明码 (1)常见概念 代数码&…

2756基于微信小程序的图书商城系统

摘要 本文将详细介绍基于微信小程序的图书商城系统的设计和实现。该系统包括服务器端和客户端两部分&#xff0c;能够满足管理员和普通用户的需求。通过对用户需求和功能的分析&#xff0c;本文将详细阐述系统设计的关键环节&#xff0c;包括数据库设计和界面设计。最后&#…

C语言ZZULIOJ1148:组合三位数之一

题目描述 把1、2、3、4、5、6、7、8、9组合成3个3位数&#xff0c;要求每个数字仅使用一次&#xff0c;使每个3位数均为完全平方数。按从小到大的顺序输出这三个三位数。 输入:无 输出:按从小到大的顺序输出这三个三位数&#xff0c;由空格隔开。输出占一行。 提示 若一个数能表…

select在标准输出和套接字上进行监控

selectServerInTCPIPbook.c的内容如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/…

教育局档案室智慧档案库房建设方案

教育局档案室智慧档案库房建设是指教育局为了更好地保存和管理学校、教师、学生等相关档案资料&#xff0c;以及保证这些档案资料的安全性、可靠性和完整性&#xff0c;而建设的一个专门的存储、管理和保护档案资料的场所。 专久智能提供的教育局档案库房建设方案从以下几个方面…

高密度统一存储在影视后期剪辑媒资应用中的优势

影视媒体行业是存储技术发展的重要推动力。Infortrend一直专注于存储的研发&#xff0c; EonStor GS 横向扩展统一存储是适合影视应用的解决方案&#xff0c;高密度机型性能卓越&#xff0c;扩展性高&#xff0c;数据保护技术安全可靠。非常具有性价比&#xff0c;在保证性能和…

msvcp71.dll,msvcr71.dll丢失的最简单的解决方法

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是MSVCR71.dll缺失。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。本文将介绍5个修复MSVCR71.dll缺失的方案&#xff0c;帮助用户解决这一问题。 一、重新安装相关…

U盘怎么加密?U盘数据该怎么加密?

在使用U盘的过程中&#xff0c;我们会将很多重要数据存放在电脑中&#xff0c;但为了保护文件的安全性&#xff0c;我们需要使用加密来进行保护。那么&#xff0c;U盘数据该怎么加密呢&#xff1f; U盘数据加密方法 想要将普通U盘变成加密U盘&#xff0c;我们需要使用专业的U盘…

如何防止听力下降?

听力受损是不可逆的&#xff0c;一旦听力下降了是无法恢复的&#xff0c;所以当我们出现听力障碍的时候&#xff0c;我们更应该注意我们的耳朵&#xff0c;想想如何能保护我们的残余听力&#xff01; 今天来告诉大家&#xff0c;哪些事是有易于听力的&#xff0c;一起来看看吧…

企业数据备份方案:如何选择适合企业的备份方法?

企事业单位通常配备文件服务器以存储涉及单位无形资产和商业机密的重要数据文件。尽管许多文件服务器配备了Raid以防止数据丢失风险&#xff0c;但员工恶意访问或黑客入侵仍可能导致数据的删除、恶意修改或加密。因此&#xff0c;为维护数据安全&#xff0c;企业需要及时备份操…

nodejs express vue uniapp电影购票系统源码

开发技术&#xff1a; node.js&#xff0c;vscode&#xff0c;HBuilder X express vue elementui uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索电影&#xff0c;轮播图&#xff0c;电影分类&#xff0c;最近上架电影 点击电影进入电影详情&am…

基于ssm+vue协同过滤算法的电影推荐系统

基于ssmvue协同过滤算法的电影推荐系统 摘要 电影推荐系统在信息技术发展的背景下日益成为研究的焦点&#xff0c;本研究基于SSM&#xff08;Spring SpringMVC MyBatis&#xff09;框架与Vue.js技术&#xff0c;以协同过滤算法为核心&#xff0c;旨在构建一种高效、准确的电影…

软考网络工程师知识点总结(三)

目录 41、特殊地址 42、子网划分 43、CIDR路由汇聚 44、IP数据报 45、ARP协议 46、ICMP协议 47、IPv6地址表示及类型 48、IPv6地址前缀 49、IPv4过渡IPv6 50、UDP传输层协议 51、TCP传输层协议 52、TCP头部中常见字段的含义&#xff1a; 53、TCP的流量控制和拥塞控…

三国杀中的概率学问题3——王荣

前言 本文是三国杀中的概率学问题系列文章中的一篇&#xff0c;将详细讨论王荣吉占的期望摸牌数问题。并加上连续情形作为拓展。 值得说明的是&#xff0c;本文的思路受到了一篇文章的启发&#xff0c;在此特别鸣谢&#xff0c;这是文章的链接。 王荣吉占的期望摸牌数 王荣的…

深度学习之基于YoloV5电梯电动车预警系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在电梯电动车预警系统中的应用是一个复杂的系统工程&#xff0c;涉及计算机视觉、机器学习、深度学习等领域…

4.0 Linux进程前导知识

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 冯.诺依曼体系 CPU&#xff1a;运算器&#xff0c;控制器 输入设备&#xff1a;键盘&#xff0c;麦克风&#xff0c;摄像头&#xff0c;鼠标&#xff0c;网卡&#xff0c;磁盘等。 输出设备&#xff1a;显示器&#xff0…

74hc165 编程注意事项

74hc165 是一个并行输入转串行输出的io 扩展芯片&#xff0c;支持级联。 74HC165 的工作原理基于移位寄存器的设计。它通过四个输入引脚( SER, SRCLK, RCLK, OE)来实现数据的串行输入、并行输出。在时钟信号的驱动下&#xff0c;数据逐位地从串行输入引脚SER进入寄存器。每次时…

CCLink转Modbus TCP网关_MODBUS网口设置

兴达易控CCLink转Modbus TCP网关是一种用于连接CCLink网络和Modbus TCP网络的设备。它提供了简单易用的MODBUS网口设置&#xff0c;可以帮助用户轻松地配置和管理网络连接 1 、网关做为MODBUS主站 &#xff08;1&#xff09;将电脑用网线连接至网关的P3网口上。 &#xff08;…

CSRF和XSS漏洞结合实战案例

文章目录 CSRF和XSS漏洞结合实战案例实验原理实验步骤信息收集构造CSRF和XSS代码xss注入 CSRF和XSS漏洞结合实战案例 实验环境为csm 实验原理 攻击者利用JavaScript可以构造请求的功能在留言面板构造一个存储型xss注入&#xff0c;里面的内容为js请求。请求新添加用户&…

性能爆炸!Python多进程模式实现多核CPU并行计算

文章目录 前言一、.Python中的多进程模式二、提高程序执行效率的方法1.多进程并发执行任务2.进程池 3.消息队列4.共享内存5.异步IO 总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具…