• myvector.h

     #pragma once
    #include <initializer_list>
    #include <iostream>
    using namespace std; template<class T>
    class myvector
    {
    public:
    myvector();
    myvector(int n);
    myvector(initializer_list<T> my);
    void show() const;
    ~myvector();
    //用于迭代
    T *begin();
    T *end();
    int arraysize();
    int memsize();
    //后插
    void push_back(T data);
    //前插
    void push_front(T data);
    //返回的是副本
    T operator[](int i) const;
    //返回的不是副本
    T &operator[](int i);
    //发现左值
    T* find(T &t);
    //发现右值
    T* find(T &&t);
    //改变一个值,传递的是右值
    void change(T *pos, T &&t);
    //改变一个值,传递的是左值
    void change(T *pos, T &t);
    void del(T &t);
    void del(T &&t);
    //找到的位置之前插入
    void insert(T &t, T &newt);
    void insert(T &&t, T &&newt); template<class T>
    friend ostream& operator <<(ostream &out, myvector<T> &myv);
    public:
    T * p;
    int memn;//内存长度
    int realn;//数组长度
    };
  • myvector.cpp
     #include "myvector.h"
    
     template<class T>
    myvector<T>::myvector():p(nullptr),memn(),realn()
    { } template<class T>
    myvector<T>::myvector(int n)
    {
    this->memn = this->realn = n;
    this->p = new T[n];
    memset(this->p, , sizeof(T)*n);
    } template<class T>
    myvector<T>::myvector(initializer_list<T> my)
    {
    this->realn = this->memn = my.size();
    this->p = new T[my.size()];
    int id = ;
    //初始化
    for (auto i : my)
    {
    this->p[id] = i;
    id++;
    }
    } template<class T>
    void myvector<T>::show() const
    {
    for (int i = ; i < realn; i++)
    {
    cout << p[i];
    }
    } template<class T>
    myvector<T>::~myvector()
    {
    if (p != nullptr)
    {
    delete[] this->p;
    }
    } template<class T>
    T * myvector<T>::begin()
    {
    return this->p;
    } template<class T>
    T * myvector<T>::end()
    {
    return this->p + this->realn;
    } template<class T>
    int myvector<T>::arraysize()
    {
    return this->realn;
    } template<class T>
    int myvector<T>::memsize()
    {
    return this->memn;
    } template<class T>
    void myvector<T>::push_back(T data)
    {
    if (this->p == nullptr || this->memn == )
    {
    p = new T;
    *p = data;
    memn = ;
    realn = ;
    }
    else if(memn == realn)
    {
    T *ptemp = new T[this->memn + ];
    memcpy(ptemp, this->p, this->realn * sizeof(T));
    *(ptemp + realn) = data;
    delete[] this->p;
    this->p = ptemp;
    realn += ;
    memn += ;
    }
    else
    {
    p[realn] = data;
    realn++;
    }
    } template<class T>
    void myvector<T>::push_front(T data)
    {
    if (this->p == nullptr || this->memn == )
    {
    p = new T;
    *p = data;
    memn = ;
    realn = ;
    }
    else if (memn == realn)
    {
    T *ptemp = new T[this->memn + ];
    memcpy(ptemp + , this->p, this->realn * sizeof(T));
    *ptemp = data;
    delete[] this->p;
    this->p = ptemp;
    realn += ;
    memn += ;
    }
    else
    {
    for (int i = ; i < realn; i++)
    {
    p[i + ] = p[i];
    }
    p[] = data;
    realn += ;
    }
    } template<class T>
    T myvector<T>::operator[](int i) const
    {
    if (i > realn)
    {
    throw ;
    }
    return this->p[i];
    } template<class T>
    T & myvector<T>::operator[](int i)
    {
    if (i > realn)
    {
    throw ;
    }
    return this->p[i];
    } template<class T>
    T * myvector<T>::find(T & t)
    {
    for (auto ib = this->begin(); ib != this->end(); ib++)
    {
    if (*it == t)
    {
    return ib;
    }
    }
    } template<class T>
    T * myvector<T>::find(T && t)
    {
    for (auto ib = this->begin(); ib != this->end(); ib++)
    {
    if (*it == t)
    {
    return ib;
    }
    }
    } template<class T>
    void myvector<T>::change(T * pos, T && t)
    {
    if (pos != nullptr)
    {
    *pos = t;
    }
    } template<class T>
    void myvector<T>::change(T * pos, T & t)
    {
    if (pos != nullptr)
    {
    *pos = t;
    }
    } template<class T>
    void myvector<T>::del(T & t)
    {
    int pos = -;
    for (int i = ; i < this->realn; i++)
    {
    if (t == *(this->p + i))
    {
    pos = i;
    break;
    }
    }
    if (pos != -)
    {
    if (pos == this->realn)
    {
    this->realn -= ;
    }
    else
    {
    for (int i = pos; i < realn-; i++)
    {
    p[i] = p[i + ];
    }
    realn -= ;
    }
    }
    } template<class T>
    void myvector<T>::del(T && t)
    {
    int pos = -;
    for (int i = ; i < this->realn; i++)
    {
    if (t == *(this->p + i))
    {
    pos = i;
    break;
    }
    }
    if (pos != -)
    {
    if (pos == this->realn)
    {
    this->realn -= ;
    }
    else
    {
    for (int i = pos; i < realn - ; i++)
    {
    p[i] = p[i + ];
    }
    realn -= ;
    }
    }
    } template<class T>
    void myvector<T>::insert(T & t, T & newt)
    {
    int pos = -;
    for (int i = ; i < this->realn; i++)
    {
    if (t == *(this->p + i))
    {
    pos = i;
    break;
    }
    } if (pos != -)
    {
    if (this->realn == this->memn)
    {
    T *ptemp = new T[this->memn + ];
    memcpy(ptemp, this->p, sizeof(T)*memn); delete[] this->p;
    this->p = ptemp;
    this->realn += ;
    this->memn += ;
    for (int i = realn - ; i >= pos; i--)
    {
    p[i + ] = p[i];
    }
    p[pos] = newt;
    }
    else
    {
    for (int i = realn - ; i >= pos; i--)
    {
    p[i + ] = p[i];
    }
    p[pos] = newt;
    this->realn += ;
    }
    } } template<class T>
    void myvector<T>::insert(T && t, T && newt)
    {
    int pos = -;
    for (int i = ; i < this->realn; i++)
    {
    if (t == *(this->p + i))
    {
    pos = i;
    break;
    }
    } if (pos != -)
    {
    if (this->realn == this->memn)
    {
    T *ptemp = new T[this->memn + ];
    memcpy(ptemp, this->p, sizeof(T)*memn); delete[] this->p;
    this->p = ptemp;
    this->realn += ;
    this->memn += ;
    for (int i = realn - ; i >= pos; i--)
    {
    p[i + ] = p[i];
    }
    p[pos] = newt;
    }
    else
    {
    for (int i = realn - ; i >= pos; i--)
    {
    p[i + ] = p[i];
    }
    p[pos] = newt;
    this->realn += ;
    }
    }
    } template<class T>
    ostream & operator<<(ostream & out, myvector<T> & myv)
    {
    for (int i = ; i < myv.realn; i++)
    {
    out << myv.p[i];
    }
    return out;
    }
  • main.cpp
     #include "myvector.h"
    #include "myvector.cpp" void main()
    {
    myvector<double> myv({ 1.1,2.2,3.3 });
    //myv.show();
    ////迭代器
    //for (auto i : myv)
    //{
    // cout << i << endl;
    //}
    myv.push_front(4.4);
    myv.push_back(5.5);
    myv.insert(2.2, 8.8);
    myv.del(2.2);
    myv.push_back(2.2);
    myv.del(2.2);
    /*for (auto ib = myv.begin(), ie = myv.end(); ib != ie; ib++)
    {
    cout << *ib << endl;
    }*/
    //cout << myv[1] << endl;
    cout << myv << endl;
    myv.show();
    cin.get();
    }

143.vector模板库的更多相关文章

  1. 35.自己实现vector模板库myvector

    myvector.h #pragma once //自己写的vector模板库 template <class T> class myvector { public: //构造 myvec ...

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

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

  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标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

随机推荐

  1. js 预加载图片image()函数

    创建一个Image对象:var a=new Image();    定义Image对象的src: a.src=”xxx.gif”;    这样做就相当于给浏览器缓存了一张图片. 图像对象: 建立图像对 ...

  2. Ubuntu14.04下Mongodb的Java API编程实例(手动项目或者maven项目)

    不多说,直接上干货! 若大家,不会安装的话,则请移步,随便挑选一种. Ubuntu14.04下Mongodb(在线安装方式|apt-get)安装部署步骤(图文详解)(博主推荐) Ubuntu14.04 ...

  3. jQuery中文学习站点

    jQuery是一个快速.简单的Javascript library,它简化了HTML文件的traversing,事件处理.动画.Ajax互动,从而方便了网页制作的快速发展.jQuery是为改变你编写J ...

  4. VB入门在线视频教程大全学习

    课程目录 9分钟47秒 课时1第一课:怎么编写程序 14分钟1秒 课时1第十七课第1节:文件读写的几种方式 14分钟14秒 课时2第二课:什么是变量和变量类型 19分钟24秒 课时3第三课:变量的声明 ...

  5. 【原创】java的反射机制

    什么是java的反射?java在运行期间可以动态的加载.解析和使用一些在编译阶段并不确定的类型,这一机制被称作反射.它可以加载只有运行时才能确定的数据类型,解析类的内部结构,获取其基本信息,如方法.属 ...

  6. Ubuntu 16.04安装Caffe的记录及FCN官方代码的配置

    相关内容搜集自官方文档与网络,既无创新性,也不求甚解,我也不了解Caffe,仅仅搭上之后做个记录,方便以后重装 安装依赖项sudo apt-get install libprotobuf-dev li ...

  7. Linux中设置vim自动在运算符号两边加上空格

    vim中设置自动在=+-之类的运算符号左右两边加上空格.原版的vim不带这个功能,写出的代码例如z=x+y,不美观,很多编译器(如VS)能够自动在符号两边加上空格,如z = x + y,看起来比较美观 ...

  8. Codeforces Round #499 (Div. 2) C.FLY 数学推导_逆推

    本题应该是可以使用实数二分的,不过笔者一直未调出来,而且发现了一种更为优美的解法,那就是逆推. 首先,不难猜到在最优解中当飞船回到 111 号节点时油量一定为 000, 这就意味着减少的油量等于减少之 ...

  9. 3D立体方块旋转图册

    代码可直接复制使用看效果 这个文章参考了Lazy.Cat的文章:https://www.cnblogs.com/Lazy-Cat/p/9750244.html,大家也可以去看看,他讲的还是比较详细的. ...

  10. shell试题

    1.按单词出现频率降序排序! 2.按字母出现频率降序排序! The months of learning in Old Boy education are the few months that I ...