重写vector类,完成基本功能,不含迭代器
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.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类,完成基本功能,不含迭代器的更多相关文章
- Java API —— ArrayList类 & Vector类 & LinkList类
1.ArrayList类 1)ArrayList类概述 · 底层数据结构是数组,查询快,增删慢 · 线程不安全,效率高 2)ArrayList案例 ...
- 转载:C++ vector 类学习笔记
声明:本文转载自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机 ...
- 五:Java之Vector类专题
据说期末考试要考到Vector 这个类,出于复习须要在这里就要好好整理下这个类了. 一.基本概念 Vector 是可实现自己主动增长的对象数组. java.util.vector提供了向量类(vect ...
- Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?
Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ...
- 谈一谈Vector类
一.关于Vector类的注意事项 1.从 Java 2 平台 v1.2 开始,vector类改进为实现 List 接口,成为 Java Collections Framework 的成员:所以vect ...
- Vector类与Enumeration接口
Vector类用于保存一组对象,由于java不支持动态数组,Vector可以用于实现跟动态数组差不多的功能.如果要将一组对象存放在某种数据结构中,但是不能确定对象的个数时,Vector是一个不错的选择 ...
- C++ vector类详解
转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vec ...
- stl vector 类
目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此 ...
- WaterfallFlowLayout瀑布流用重写UICollectionViewFlowLayout类实现
最近调研瀑布流,在gitHub上下了个Demo发现它的所有视图都是用Main.storyboard拖的, 自己研究半天没研究明白; 然后就又找了一个Demo, 它的视图全是手打的, 但是实现的方法不太 ...
随机推荐
- 双态运维分享之:业务场景驱动的服务型CMDB
最近这几年,国内外CMDB失败的案例比比皆是,成功的寥寥可数,有人质疑CMDB is dead?但各种业务场景表明,当下数据中心运维,CMDB依然是不可或缺的一部分,它承载着运维的基础,掌握运维的命脉 ...
- 【Loadrunner】平台1.9环境APP成功录制并调试成功后的脚本备份
1.录制相关Loadrunner及录制的APP所在手机网络代理相关设置请参考日志:http://www.cnblogs.com/zhuzhubaoya/p/9152022.html 2.调试成功的脚本 ...
- 格式工厂将图片变小,有500kb变为16kb
1:打开格式工厂,选择图片栏>jpg 2:点击添加文件,选择要处理 的图片.点击输出配置,配置转换后 的大小(可手动调整),越小占用空间越少,点击确定 3: 主页面点击转换按钮,转换成功后,显示 ...
- c primer plus(五版)编程练习-第八章编程练习
1.设计一个程序,统计从输入到文件结尾为止的字符数. #include<stdio.h> int main(void){ int ch; int i; i=; while((ch = ge ...
- 更好的利用配置文件和importlib
需求:做不同的操作时只需修改配置文件即可完成 # message/email.py from .base import Base # 子类必须实现send方法,否则抛出异常 class Email(B ...
- web http协议
http协议超文本传输协议 http协议是IOS七层协议的应用层,是基于TCP/IP协议的,为什么还要多一个协议了,其实利用TCP协议也是可以的,但是TCP三次握手后是一直保持连接的,如果单单是c/s ...
- 字典树 trie
Trie树 Trie树,就是字母树.Trie树是多叉树,每个节点为一个字母.其根节点为象征节点(就是说没有含义,但是存在这个节点),从根节点开始建立,每个节点至多为26个子节点(不要我说 ...
- 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) Solution
A - Odd Palindrome 水. #include <bits/stdc++.h> using namespace std; #define N 110 char s[N]; i ...
- CodeForces - 366C Dima and Salad (01背包)
题意:n件东西,有属性a和属性b.要选取若干件东西,使得\(\frac{\sum a_j}{\sum b_j} = k\).在这个条件下,问\(\sum a_j\)最大是多少. 分析:可以将其转化为0 ...
- 图解Kerberos认证工作原理
本文是我在看了这篇英文说明之后的总结 https://technet.microsoft.com/zh-cn/library/cc961976.aspx 是总结,不是翻译,所以是我看后按自己的理解写的 ...