重写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类


//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];

}

原文地址:https://www.cnblogs.com/meihao1203/p/9049225.html

时间: 2024-08-29 13:42:00

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

C++ vector类详解

转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了:而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量. vector的扩充机制:按照容器现在容量的一倍进行增长.vecto

强大而好用的vector类------载自他处

vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了:而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量. vector的扩充机制:按照容器现在容量的一倍进行增长.vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请

五:Java之Vector类专题

据说期末考试要考到Vector 这个类,出于复习需要在这里就要好好整理下这个类了. 一.基本概念 Vector 是可实现自动增长的对象数组. java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提高程序的质量.比如在c,c++中所谓的"动态数组"一般都由指针来实现.为了弥补这个缺点,Java提供了丰富的类库来方便编程者使用,vector类便是其中之一.事实上,灵活使用数组也可以完成向

stl vector 类

目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此参数描述了向量的初始大小. 说明 vector是一种动态数组,是基本数组的类模板.其内部定义了很多基本操作. #include <vector> 注意:头文件没有“.h”构造: 这个构造函数还有一个可选的参数,这是一个类型为T的实例,描述了各个向量种各成员的初始值: 如:vector<int

Vector类与Enumeration接口

Vector类用于保存一组对象,由于java不支持动态数组,Vector可以用于实现跟动态数组差不多的功能.如果要将一组对象存放在某种数据结构中,但是不能确定对象的个数时,Vector是一个不错的选择. 例:将键盘上输入的一个数字序列的每位数字存储在vector对象中,然后在屏幕上打印出各位数字相加的结果. import java.util.*; //Vector类和Enumeration接口都在这个包中 public class TestVector { public static void

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

答:Object-c的类不可以多重继承,可以实现多个接口(协议),Category是类别,重写一个类的方式一般用分类更好,仅仅对分类有效,不会影响到其他类与原有类的关系.category的主要作用是为已经存在的类添加方法.除此之外,apple官方还推荐了另外两种使用场景: 1.可以把类的实现分开在几个不同的文件,这样做有几个显而易见的好处:第一,可以减少单个文件的体积.第二,可以不同功能的组织放到不同的category中去.第三,可以由多个不同的开发者来共同完成一个类.第三,可以按需要来加载不同

利用std::allocator实现自定义的vector类

std::allocator即空间配置器,用于内存分配.更多的细节建议大家研究相关源码. 这里仅是利用std::allocator来实现简单的自定义vector类,如有问题欢迎指正. 1 #include <iostream> 2 #include <memory> 3 using std::cout; 4 using std::endl; 5 6 template <typename Tp> 7 class Vector 8 { 9 public: 10 Vector

java11-3 String类的获取功能

package cn_String2;/* String类的获取功能 int length():获取字符串的长度. char charAt(int index):获取指定索引位置的字符 int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引. 为什么这里是int类型,而不是char类型? 原因是:'a'和97其实都可以代表'a' int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引. int indexOf(int ch,int

java11-6 String类的其它功能

String类的其他功能: 替换功能: String replace(char old,char new) String replace(String old,String new) 去除字符串两空格 String trim() 按字典顺序比较两个字符串 int compareTo(String str) 区分大小写 int compareToIgnoreCase(String str) 不区分大小写 1 public class StringTest3 { 2 3 public static