body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

实现自己的一个Vector类
//vector.h
#include<iostream>
#include<string>
using namespace std;
template<typename T>
class vector
{
        class proxy;
        public:
                vector();
                ~vector();
                void push_back(const T&);
                void pop_back();
                proxy operator[](int index);
                int size();
                int capacity();
                void reallocate();  // 重新分配内存,动态扩容
        private:
                T* _elems;  // 指向数组中的第一个元素
                T* _end;    // 指向数组本身之后的元素
                T* _first_free;  // 指向最后一个实际元素之后的那个元素
                class proxy
                {
                        public:
                                proxy(vector<T>& v,int index):_v(v),_index(index){}  
// 这里形参一定要是引用,传本身啊,不然最后_v._elems[_index]就是错的。浅拷贝
                                T& operator=(const int elem);
                                operator T(){  return _v._elems[_index];  }
                        private:
                                vector<T>& _v;  // 这个地方也是引用
                                int _index;
                };
};
// Vector模型                         
//  ______________________________    
// |_|_|_|_|_|____________________|   
// ↑         ↑                   ↑      
// _elems   _first_free            _end

//main.cpp
#include<iostream>
#include"vector.cpp"
using namespace std;
int main()
{
        vector<int> v1;
        cout<<v1.size()<<"  "<<v1.capacity()<<endl;
        v1.push_back(1);
        cout<<v1.size()<<"  "<<v1.capacity()<<endl;
        v1.push_back(2);
        cout<<v1.size()<<"  "<<v1.capacity()<<endl;
        v1.push_back(3);
        cout<<v1.size()<<"  "<<v1.capacity()<<endl;
        v1.pop_back();
        cout<<v1.size()<<"  "<<v1.capacity()<<endl;
        v1.pop_back();
        cout<<v1.size()<<"  "<<v1.capacity()<<endl;
        cout<<"----------------------------------"<<endl;
        cout<<"v1[0]="<<v1[0]<<endl;
        //v1[0] = 2;
        //(v1[0]).operator=(2);
        (v1.operator[](0)).operator=(2);
        cout<<"after change:"<<endl;
        cout<<"v1[0]="<<v1[0]<<endl;
        return 0;
}

//vector.cpp
#include<iostream>
#include"vector.h"
#include<string.h>
using namespace std;
template<typename T>
vector<T>::vector():_elems(new T[1]),_first_free(_elems)
{
        T* tmp = _elems;
        _end = ++tmp;
}
template<typename T>
vector<T>::~vector()
{
        delete _elems;
        _elems = NULL;
}
template<typename T>
int vector<T>::size()
{
        return _first_free-_elems;
}
template<typename T>
int vector<T>::capacity()
{
        return _end-_elems;
}
template<typename T>
void vector<T>::reallocate()
{
        int size = this->size();
        T* tmp = new T[size*2];
        memcpy(tmp,_elems,size*sizeof(T));
        _elems = tmp;
        _first_free = _elems+size;
        _end = (_elems+size*2);
}
template<typename T>
void vector<T>::push_back(const T& elem)
{
        if(this->size()!=this->capacity())
        {
                int i = (_first_free-_elems)/sizeof(T);
                _elems[i] = elem;
                ++_first_free;
        }
        else if(this->size()==this->capacity())
        {
                this->reallocate();
                int i = (_first_free-_elems)/sizeof(T);
                _elems[i] = elem;
                ++_first_free;
        }
}
template<typename T>
void vector<T>::pop_back()
{
        if(this->size()!=0)
                --_first_free;
}
template<typename T>
typename vector<T>::proxy vector<T>::operator[](int index)
{
        return proxy(*this,index);  
     // 嵌套类不传引用这里出作用域释放了,后面的=什么的没错误,但是执行就报错
}
template<typename T>
T& vector<T>::proxy::operator=(const int elem)
{
        _v._elems[_index] = elem;
        return _v._elems[_index];
}

重写vector类,完成基本功能,不含迭代器的更多相关文章

  1. Java API —— ArrayList类 & Vector类 & LinkList类

    1.ArrayList类     1)ArrayList类概述         · 底层数据结构是数组,查询快,增删慢         · 线程不安全,效率高     2)ArrayList案例   ...

  2. 转载:C++ vector 类学习笔记

    声明:本文转载自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机 ...

  3. 五:Java之Vector类专题

    据说期末考试要考到Vector 这个类,出于复习须要在这里就要好好整理下这个类了. 一.基本概念 Vector 是可实现自己主动增长的对象数组. java.util.vector提供了向量类(vect ...

  4. Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?

    Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ...

  5. 谈一谈Vector类

    一.关于Vector类的注意事项 1.从 Java 2 平台 v1.2 开始,vector类改进为实现 List 接口,成为 Java Collections Framework 的成员:所以vect ...

  6. Vector类与Enumeration接口

    Vector类用于保存一组对象,由于java不支持动态数组,Vector可以用于实现跟动态数组差不多的功能.如果要将一组对象存放在某种数据结构中,但是不能确定对象的个数时,Vector是一个不错的选择 ...

  7. C++ vector类详解

    转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vec ...

  8. stl vector 类

    目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此 ...

  9. WaterfallFlowLayout瀑布流用重写UICollectionViewFlowLayout类实现

    最近调研瀑布流,在gitHub上下了个Demo发现它的所有视图都是用Main.storyboard拖的, 自己研究半天没研究明白; 然后就又找了一个Demo, 它的视图全是手打的, 但是实现的方法不太 ...

随机推荐

  1. EOS Dapp开发(1)-基于Docker的开发环境搭建

    随着EOS主网的上线,相信基于EOS的Dapp开发会越来越多,查阅了很多资料相关的开发资料都不是很多,只能自己摸索,按照网上仅有的几篇教程,先git clonehttps://github.com/E ...

  2. Mysql5.6主从复制

    搭建(192.168.1.10 -> 192.168.1.20) 1 master 上执行 阻塞 DMLflush tables with read lock; 记录 File 和 Positi ...

  3. tools-eclipse-004-UML图安装

    git:https://github.com/takezoe/amateras-modeler 下载:http://sourceforge.jp/projects/amateras/downloads ...

  4. Spring boot 开发WebService遇到的问题之一

    当pom.xml文件中的配置: <artifactId>spring-boot-starter-parent</artifactId><version>2.0.6. ...

  5. PAT 1061 Dating[简单]

    1061 Dating(20 分) Sherlock Holmes received a note with some strange strings: Let's date! 3485djDkxh4 ...

  6. 【Cocos2dx 3.x Lua】TileMap使用

    1.编辑TileMap地图资源 2.Cocos2dx 3.x Lua中使用TileMap   Link: http://codepad.org/P0nFP1Dx  local TileMap=clas ...

  7. uva1146 2-SAT问题

    题意大白书 二分答案,然后对于每个可能的答案,跑一遍2-SAT就好了. #include <iostream> #include <string.h> #include < ...

  8. Bootstrap风格zTree树形菜单插件

    这是一款bootstrap风格jQuery zTree树形菜单插件,支持自定义编辑.添加列表菜单.删除列表等功能的jQuery树形菜单代码.在线演示 具体代码实现: <!DOCTYPE html ...

  9. http://www.artrobot.com/北京钢铁侠

    http://www.artrobot.com/ 钢铁侠ROS智能机器人 钢铁侠ROS智能机器人 型号 ARTrobot-ROS 产品图片:   产品概述: ARTrobot-ROS全开放机器人套件服 ...

  10. CCNA学习指南 -开放最短路径优先OSPF(多区域部分)

    在之前的介绍中,可以看到单区域OSPF对于古老的RIP的优点: 路由选择更新流量减小 使用与大型网络和链路速度不一样的网络 OSPF能够在LSDB中呈现网络拓扑结构,这使得它汇聚的速度远快于RIP. ...