实现vector--模板

2023-11-05

在这里,我把类函数定义与声明分开了:

以下是类定义与类函数的声明:

// vector.h
#pragma once                                                                                                                         
#include <iostream>

#include <assert.h>
#include <string>
using namespace std;

template <class T>
class Vector
{
public:
    Vector()
        :_start(NULL)
         ,_finish(NULL)
         ,_endofstorage(NULL)
    {}  
    ~Vector()
    {                                                                                                                                
        delete[] _start;
        _start = _finish = _endofstorage = NULL;
    }
    Vector(const Vector<T>& v);
    Vector<T>& operator=(Vector<T>& v);
    T& operator[](size_t pos);
    void PushBack(T a);
    void Insert(T a, int pos);
    void PopBack();
    void Erase(int pos);
    int Size() const;
    int Capacity();
    int Empty();
    void print();
protected:
    void Expand(int size);
protected:
    T* _start;
    T* _finish;
    T* _endofstorage;
};     

以下是类函数的定义:

在类外定义类函数时要加上它所属的域,在使用模板时,这里它所属的域是Vector<T>,而不是Vector。

还有值得注意的是,再类外定义类函数时每个函数前都要加上template <class T>

//vector.cpp
#include <iostream>                                                                                                                  
#include "vector.h"

template <class T>
void Vector<T>::Insert(T a, int pos)
{
    assert(pos >= 0 && pos <= Size());
    if(Capacity() == 0)
        Expand(1);
    else if(Capacity() <= Size())
        Expand(2*Capacity());
    for(int i = Size() - 1; i >= pos; --i)
    {   
        _start[i + 1] = _start[i];
    }   
    _start[pos] = a;
    ++_finish;
    return;
}                                                                                                                                    
template <class T>
void Vector<T>::PushBack(T a)
{
    Insert(a, Size());
}

template <class T>
void Vector<T>::Erase(int pos)
{
    assert(pos < Size() && pos >= 0);
    if(Size() == 0)
        return;
    for(int i = pos; i < Size() - 1; ++i)
    {
        _start[i] = _start[i+1];                                                                                                     
    }
    --_finish;
}
template <class T>
void Vector<T>::PopBack()
{
    Erase(Size() - 1);
}

template <class T>
int Vector<T>::Size() const
{
    return _finish - _start;
}
template <class T>                                                                                                                   
int Vector<T>::Capacity()
{
    return _endofstorage - _start;
}

template <class T>
void Vector<T>::Expand(int size)
{
    if(size > Capacity())
    {
        T* new_start = new T[size];
        int sz = Size();
        for(int i = 0; i < sz; ++i)
        {
            new_start[i] = _start[i];                                                                                                
        }
        delete[] _start;
        _start = new_start;
        _finish = _start + sz;
        _endofstorage = _start + size;
    }
    return;
}
template <class T>
int Vector<T>::Empty()
{
    return Size() == 0;
}
template <class T>                                                                                                                   
void Vector<T>::print()
{
    cout<<"数组中元素为:"<<endl;
    int i = 0;
    for(; i < Size(); ++i)
    {
        cout<<i<<":"<<_start[i]<<" ";
    }
    cout<<endl;
}

template <class T>
Vector<T>::Vector(const Vector<T>& v)
{
    if(v.Size() > 0)                                                                                                                 
    {
        int sz = v.Size();
        T* tmp = new T[sz];
        for(int i = 0; i < sz; ++i)
        {
            tmp[i] = v._start[i];
        }
        _start = tmp;
        _finish = _start + sz;
        _endofstorage = _finish;
    }
    else
        _start = _finish = _endofstorage = NULL;
}
                                                                                                                                     
template <class T>
Vector<T>& Vector<T>::operator=(Vector<T>& v)
{
    if(this != &v)
    {
        if(v.Size() == 0)
        {
            _finish = _start;
        }
        if(v.Size() > Size())
            Expand(v.Size());
        int sz = v.Size();
        for(int i = 0; i < sz; ++i)
        {
            _start[i] = v._start[i];                                                                                                 
        }
        _finish = _start + sz;
    }
    return *this;
}

template <class T>
T& Vector<T>::operator[](size_t pos)
{
    assert(pos > 0 && pos < Size());
    return _start[pos];
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现vector--模板 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • RESTful 风格详解

    一 什么是Restful风格 1 1 概念 RESTFUL是一种网络应用程序的设计风格和开发方式 基于HTTP 可以使用 XML 格式定义或 JSON 格式定义 最常用的数据格式是JSON 由于JSON能直接被JavaScript读取 所以
  • 任务列表 php,Laravel入门教程实战:任务列表(基础版)

    1 介绍 该快速入门指南提供了Laravel框架的基本介绍 包含了数据库迁移 Eloquent ORM 路由 验证 视图 Blade模版等内容 如果你是Laravel框架或者PHP框架的新手 这将是一个很好的起点 如果你已经在使用Larav
  • <数据结构>单链表基本功能实现

    文章目录 前言 一 单链表实验 二 使用步骤 1 链表基本功能 2 代码功能实现 总结 前言 提示 本篇主要是本小白大学期间对数据结构实验的一些基本代码功能实现 希望对一同数据结构的伙伴有所帮助 提示 以下是本篇文章正文内容 下面案例可供参
  • LINGO求解规划问题代码

    文章目录 线性规划 标量线性规划 矩阵线性规划 非线性规划 无特殊限制 整数规划 01规划 写在开头 LINGO默认所有变量是非负的 LINGO中没有严格的 lt 和 gt lt 代表 lt gt 代表 gt LINGO不区分变量的大小写
  • CentOS7.6 编译安装LNMP+Zabbix5.0

    一 服务器信息 操作系统 CentOS Linux release 7 6 1810 Core 环境 内网环境 无公网出口 YUM源 本地yum MySQL版本 5 7 32 Nginx版本 nginx 1 22 0 PHP版本 php 7
  • 在前端vue项目引入less,使用less,在less引用外部文件,在less中使用变量

    在前端vue项目引入less 使用less 在less引用外部文件 在less中使用变量 一 less是什么 二 操作步骤 1 引入库 2 设置style的lang属性 3 使用less less 中的 calc 总结 一 less是什么
  • 不带头结点的单链表c语言,不带头结点的单链表的实现(C语言)

    不带头结点的单链表的实现 C语言 不带头结点的单链表的实现 C语言 链表中的数据是以结点来表示的 每个结点的构成 元素 数据元素的映象 指针 指示后继元素存储位置 元素就是存储数据的存储单元 指针就是连接每个结点的地址数据 以 结点的序列
  • Zabbix的模板管理与配置

    Zabbix的模板管理与配置 一 查看默认模板的配置项 1 打开客户端信息配置界面 2 选择默认模板的监控项 二 服务端获取客户端的监控项 1 获取客户端系统相关监控项 2 获取客户端硬盘信息等相关监控项 三 创建自定义监控项的key 1
  • unity的lineRenderer

    本文转载自 http blog csdn net zuoyamin article details 8997729 LineRenderer线渲染器主要是用于在3D中渲染线段 虽然我们也可以使用GL图像库来渲染线段 但是使用LineRend
  • MCP2515板级驱动

    MCP2515板级驱动 前言 一 MCP2515简述 二 硬件连接 三 驱动源码 前言 在需要多路CAN接口应用场景 可选方案一般为带CAN接口的协处理器或者是独立的CAN控制器 独立的CAN控制器常用的有SJA1000 MCP2515等
  • 工具、学习网站

    目录 图片处理工具 1 BgRemover 在线图片去底工具 2 Convertio 文件转换器 3 视频转音频 4 视频转 Gif 5 传图识色 6 本地图片在线存储引用 Image Upload 7 RGB CMYK 转换工具 各大工具
  • 单链表实现

    代码 编写程序实现单向链表数据结构 public class Node Object data Node next public class MyLinkedList Node header 添加数据的方法 删除数据的方法 修改数据的方法
  • 【精】【Java8】===两个List集合取交集、并集、差集

    业务场景 根据用户查询权限 入参 UserCode lastQueryTime 上次查询时间 出参 权限变化的列表 oldList 上次查询到的权限列表 currList 当前查询到的权限列表 比对两个list找出 移除和增加的权限加以标识
  • Idea登录Github invalid authentication data. 404 Not Found-Not Foun

    转发地址 点击我
  • 用git拉代码

    1 新建远程仓库 下载和安装git 傻瓜方式next 登录或注册账号 进入界面创建仓库 1 2添加ssh公钥并下载项目 用vscode打开随便建一个文件 1 3git创建分支和切换分支 相当于分支是队员们的一套代码 主支是组长的 队员在分支
  • Springboot Thymeleaf Html转Pdf

    新建项目 说明 用itextpdf写pdf 样式实在是太折磨了 这里选用Thymeleaf模板生成html转pdf html css写样式排版好太多了 引入依赖
  • python爬虫--beautifulsoup使用介绍

    简单来说 Beautiful Soup是python的一个库 最主要的功能是从网页抓取数据 官方解释如下 Beautiful Soup提供一些简单的 python式的函数用来处理导航 搜索 修改分析树等功能 它是一个工具箱 通过解析文档为用
  • 如何解决 Spring JPA @Table 和 @Column 失效的问题

    问题 下面的代码 我们使用 Spring JPA 作为数据库访问层 并且用 Table 和 Column 定义了表和列名 但是 Hibernate 给出的 SQL 语句并没有使用我们定义的名称 节点 Entity Table name No
  • 2021江苏连云港高考成绩查询时间,2021连云港市地区高考成绩排名查询,连云港市高考各高中成绩喜报榜单...

    距离2018年高考还有不到一个月的时间了 很多人在准备最后冲刺的同时 也在关心高考成绩 2018各地区高考成绩排名查询 高考各高中成绩喜报榜单尚未公布 下面是往年各地区高考成绩排名查询 高考各高中成绩喜报榜单 想要了解同学可以参考下 同时关
  • 实现vector--模板

    在这里 我把类函数定义与声明分开了 以下是类定义与类函数的声明 vector h pragma once include