• myvector.h

     #pragma once
    
     //自己写的vector模板库
    template <class T>
    class myvector
    {
    public:
    //构造
    myvector();
    //析构
    ~myvector();
    //尾插
    void push_back(T t);
    //索引
    T *find(T t);
    //改变
    void change(T*pos, T t);
    //删除
    void del(T t);
    //显示
    void show();
    //重载[]操作符
    T operator [](int i); //指定位置插入
    void insert(T findt, T t);
    public:
    //数据指针
    T *p;
    //标记内存长度
    int n;
    //实际长度
    int realn;
    };
  • myvector.cpp
     #include "myvector.h"
    
     //构造初始化
    template <class T>
    myvector<T>::myvector()
    {
    p = nullptr;
    n = realn = ;
    } //析构函数清空内存
    template <class T>
    myvector<T>::~myvector()
    {
    if (p!=nullptr)
    {
    delete []p;
    p = nullptr;//清空
    }
    } //尾部插入
    template <class T>
    void myvector<T>::push_back(T t)
    {
    //如果是空指针
    if (p==nullptr)
    {
    //分配内存
    p = new T;
    //赋值
    *p = t;
    //真实的长度和当前长度都赋值为1
    realn = n = ;
    }
    else
    {
    //如果不为空则重新分配内存
    T *ptemp = new T[n + ];
    //拷贝到新的空间
    for (int i = ; i < n;i++)
    {
    *(ptemp + i) = *(p + i);
    }
    //赋值最后一个元素
    *(ptemp + n) = t;
    //把原来的空间给删除
    delete []p; //指向新的空间
    p = ptemp; //真实长度与预留总长度都加1
    realn += ;
    n += ;
    }
    } //显示数据
    template <class T>
    void myvector<T>::show()
    {
    if (p==NULL)
    {
    return;
    }
    else
    {
    //遍历
    for (int i = ; i < realn;i++)
    {
    cout << p[i] << " ";
    }
    cout << "\n";
    }
    } //查询某一个数据
    template <class T>
    T * myvector<T>::find(T t)
    {
    //遍历查询,返回指针位置
    for (int i = ; i < realn; i++)
    {
    if (t==*(p+i))
    {
    return p + i;
    }
    }
    return nullptr;
    } //改变指定位置的数据
    template <class T>
    void myvector<T>::change(T*pos, T t)
    {
    //如果位置为空
    if (pos==nullptr)
    {
    return;
    }
    //如果不为空
    else
    {
    *pos = t;
    }
    } //删除某指定的第一个数据
    template <class T>
    void myvector<T>::del(T t)
    {
    //标识有没有找到
    int pos = -;
    //遍历查找,如果找到了记录位置
    for (int i = ; i < realn; i++)
    {
    if (t == *(p + i))
    {
    pos = i;
    break;
    }
    }
    //如果找到
    if (pos!=-)
    {
    //如果是最后一个元素
    if (pos== realn-)
    {
    realn -= ;
    }
    //如果不是最后一个元素,则向前移动
    else
    {
    for (int i = pos; i < realn-;i++)
    {
    p[i] = p[i + ];
    }
    realn -= ;
    }
    }
    } //插入
    template <class T>
    void myvector<T>::insert(T findt, T t)
    {
    //如果预留长度满了
    if (n == realn)
    {
    //找到指定位置
    int pos = -;
    for (int i = ; i < realn; i++)
    {
    if (findt == *(p + i))
    {
    pos = i;
    break;
    }
    }
    //如果找到了
    if (pos != -)
    {
    //重新分配内存并拷贝
    T *ptemp = new T[n + ];//重新分配内存
    for (int i = ; i < n; i++)
    {
    *(ptemp + i) = *(p + i);//拷贝
    }
    //删除原数据
    delete[] p;
    //指向新内存
    p = ptemp;
    //预留长度加1
    realn += ;
    //真实长度加1
    n += ; //指定位置数据往后移
    for (int i = realn - ; i >= pos; i--)
    {
    p[i + ] = p[i];//往前移动
    }
    //要插入的位置赋值
    p[pos] = t;
    }
    }
    //如果预留的长度没有满,则不用重新分配内存
    else
    {
    //找到指定位置
    int pos = -;
    for (int i = ; i < realn; i++)
    {
    if (findt == *(p + i))
    {
    pos = i;
    break;
    }
    }
    //如果找到了
    if (pos != -)
    {
    //指定位置数据往后移
    for (int i = realn - ; i >= pos; i--)
    {
    p[i + ] = p[i]; }
    p[pos] = t;
    realn += ;
    }
    }
    } //重载[]运算符
    template <class T>
    T myvector<T>::operator [](int i)
    {
    if (i < || i>=realn)
    {
    return NULL;
    }
    return p[i];
    }
  • main.cpp
     #include <iostream>
    #include<stdlib.h>
    #include <vector>
    #include <string>
    #include "myvector.h"
    #include "myvector.cpp"
    using namespace std; //测试函数
    void main()
    {
    myvector<int> myv1;
    myv1.push_back();
    myv1.push_back();
    myv1.push_back();
    myv1.push_back();
    myv1.push_back();
    myvector<int> myv2;
    myv2.push_back();
    myv2.push_back();
    myv2.push_back(); myvector<int> myv3;
    myv3.push_back();
    myv3.push_back();
    myv3.push_back();
    myv3.push_back(); myvector< myvector<int>* > myvv;//自己写的模板嵌套用指针 myvv.push_back(&myv1);
    myvv.push_back(&myv2);
    myvv.push_back(&myv3);
    myvv[]->show();
    myvv[]->show();
    myvv[]->show(); cout << myv1[] << endl;
    cin.get(); }

35.自己实现vector模板库myvector的更多相关文章

  1. c++转载系列 std::vector模板库用法介绍

    来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...

  2. 143.vector模板库

    myvector.h #pragma once #include <initializer_list> #include <iostream> using namespace ...

  3. C++ 标准模板库(STL)——容器(Containers)的用法及理解

    C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector).队列(queue).栈(stack).set.map等.这次主要 ...

  4. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  5. C++STL模板库序列容器之vector

    目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...

  6. C++标准模板库(STL)之Vector

    在C中,有很多东西需要自己实现.C++提供了标准模板库(Standard Template Libray,STL),其中封装了很多容器,不需要费力去实现它们的细节而直接调用函数来实现功能. 具体容器链 ...

  7. C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...

  8. C++:标准模板库vector

    一:介绍 vector是C++标准模板库,是一个容器,底层是数组,为连续内存. 命名空间为std,所属头文件为<vector>   注意:不是<vector.h> vector ...

  9. 标准模板库(STL)学习指南之sort排序

    对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思 ...

随机推荐

  1. Thrift源代码分析(七)-- TServerserver分析

    Thrift採用了TServer来作为server的抽象,提供了多种类型的server实现.用TServerTransport作为server的Acceptor抽象,来监听端口.创建clientSoc ...

  2. bzoj3262: 陌上花开(cdq分治+树状数组)

    3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...

  3. iOS:简单使用UIAlertVIew和UIActionSheet

    做iOS开发的同学想必都用过UIAlertVIew或者UIActionSheet.UIAlertVIew 可以弹出一个出现在屏幕中间的提示视图,给用户展示信息,并让用户自己选择操作,UIActionS ...

  4. Redis和Memcache和MongoDB简介及区别分析(整理)

    Redis和Memcache 一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年 ...

  5. HttpClient get和HttpClient Post请求的方式获取服务器的返回数据

    1.转自:https://blog.csdn.net/alinshen/article/details/78221567?utm_source=blogxgwz4 /*  * 演示通过HttpClie ...

  6. 乔治·霍兹(George Hotz):特斯拉、谷歌最可怕的对手!

    17岁破解iPhone,21岁攻陷索尼PS3:现在,他是埃隆·马斯克最可怕的对手.   黑客往事   许多年后,当乔治·霍兹(George Hotz)回首往事,一定会把2007年作为自己传奇人生的起点 ...

  7. 线程进阶:多任务处理(17)——Java中的锁(Unsafe基础)

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  8. solarwinds之网络发现

    1.  首先需要添加网络发现   2.  使用public   3.  添加主机   4.  网络地址选择   5.  默认下一步   6.  运行发现   7.  扫描结构如下   8.  下一步 ...

  9. c#学习0217

    1 继承 继承 1 子类是否继承了父类的构造函数 答案:子类并没有继承父类的构造函数 但是子类或默认调用父类的无参数的构造函数 在子类中创建父类对象 这样子类才可以使用父类的成员 如果在父类中声明了有 ...

  10. 【BZOJ3678】Wangxz和OJ

    题意: 不想讲 题解: Rope真香! 正解是Splay缩点,访问时再拆成一个序列 代码: //STL dafa good! #include<algorithm> #include< ...