STL部分的实现
C++的STL很强大,里面实现很多功能
就平时经常会用到的vector之类的,自己实现一下,
有哪块错误的希望大神给予指点
vector类模板
template<typename T>
class Cvector
{
public://公有方法
typedef T value_type;//类型的萃取
Cvector() //vector构造函数不开辟内存
:mpvec(NULL),msize(0),mcur(0)
{
mpvec = NULL;
msize = 0;
mcur = 0;
}
//析构函数,开辟的是个数组,所以delete[];
~Cvector()
{
delete []mpvec;
mpvec = NULL;
}
Cvector(int size,const T &val = T())//带有参数的构造函数
:msize(size),mcur(size)
{
mpvec = new T[size];
msize = size;
mcur = 0;
for (int i =0;i<size;i++)
{
mpvec[i] = val;
}
}
vector有两种插入元素的方法,一种是尾插push_back,一种是inset按位置插入,在这里实现了尾插
void push_back(const T &val)//插入元素
{
if(full())
{
resize();
}
mpvec[mcur++] = val;
}
void pop_back()//删除元素
{
if (empty())
{
return ;
}
mcur--;
}
T& operator[](int index)//[]运算符的重载
{
return mpvec[index];
}
int size()const{return mcur;}//vector 当前所使用的数组的大小
bool empty()const{return mcur==0;}//判断是否为空
bool full() //判断是否为满
{
return mcur == msize;
}
class iterator//自己实现的迭代器
{//根据使用迭代器时所需要的然后写出它的成员方法
public:
typedef T value_type;
iterator(T *ptr,int pos)
{
mit = ptr +pos;
}
void operator++()
{
mit++;
}
bool operator!=(const iterator &src)
{
return mit != src.mit;
}
T &operator *()
{
return *mit;
}
iterator operator+(int size)
{
return iterator(mit+size,0);
}
iterator operator-(int size)
{
return iterator(mit-size,0);
}
private:
T *mit;
};
iterator begin()
{
return iterator(mpvec,0);
}
iterator end()
{
return iterator(mpvec,mcur);
}
private://成员变量
T *mpvec;//指针指向一个数组
int msize;//数组的总大小
int mcur;//当前所用的大小
void resize()//当数组满了之后自己将数组的大小放大至二倍
{
if (mpvec = NULL)
{
mpvec = new T[1];
msize = 1;
mcur =0;
}
else
{
T *ptmp = new T[msize*2];
memcpy(ptmp,mpvec,sizeof(T)*mcur);
delete []mpvec;
mpvec = ptmp;
}
}
Cvector<T>& operator=(const Cvector<T>&src);
Cvector(const Cvector<T>&src);
};
//自己实现的打印函数模板
template<typename Container>
void showContainer(Container &con)
{
Container::iterator it = con.begin();
for (;it != con.end();++it)
{
cout<< *it <<" ";
}
cout<<endl;
}
//排序函数,最后一个参数是函数指针,但是调用函数的时候开销太大不建议使用
template<typename InputIterator>
void mysort(InputIterator first,InputIterator last
,bool (*pfunc)(typename InputIterator::value_type,
typename InputIterator::value_type))
{
typedef InputIterator::value_type T;
InputIterator it1 = first;
InputIterator it2 = first;
int k=0;
for (;it1 != last;++it1,++k)
{
for (it2 = first;it2!=last-1-k;++it2)
{
if (*it2 > *(it2+1))
{
T tmp = *it2;
*it2 = *(it2+1);
*(it2+1) = tmp;
}
}
}
}
template<typename T>
bool _greater(T a,T b)
{
return a>b;
}
template<typename T>
bool _less(T a,T b)
{
return a<b;
}
//sort函数的第二个版本
template<typename InputIterator,typename Compare>
void mysort(InputIterator first,InputIterator last
,Compare &comp)
{
typedef InputIterator::value_type T;
InputIterator it1 = first;
InputIterator it2 = first;
int k=0;
for (;it1 != last;++it1,++k)
{
for (it2 = first;it2!=last-1-k;++it2)
{
if (*it2 > *(it2+1))
{
T tmp = *it2;
*it2 = *(it2+1);
*(it2+1) = tmp;
}
}
}
}
template<typename T>
class Mygreater
{
public:
bool operator()(T a,T b)
{
return a>b;
}
};
template<typename T>
class Myless
{
public:
bool operator()(T a,T b)
{
return a<b;
}
};
//自己实现的myfind_if函数
template<typename InputIterator,typename Compare>
InputIterator myfind_if(InputIterator first,InputIterator last
,Compare &comp)
{
for (;first!=last;++first)
{
if (comp(*first))
{
return first;
}
}
return last;
}
template<typename T>
class My_mless
{
public:
My_mless(T Val = T()):val(Val){}
bool operator()(T a)
{
return a<val;
}
private:
T val;
};
//mycopy函数
template<typename InputIterator, typename OutputIterator>
void mycopy(InputIterator first, InputIterator last,
OutputIterator dest)
{
InputIterator it = first;
for (; it != last; ++first)
{
*dest = *it;
++dest;
}
}
//插入型迭代器
template<typename Container>
class myback_insert_iterator
{
public:
typedef typename Container::value_type T;
myback_insert_iterator(Container &Con):con(Con){}
void operator=(const T&val)
{
con.push_back(val);
}
myback_insert_iterator<Container>& operator*()
{
return *this;
}
myback_insert_iterator<Container>& operator++()
{
return *this;
}
private:
Container &con;
};
template<typename Container>
myback_insert_iterator<Container>myback_insert(Container &com)
{
return myback_insert_iterator<Container>(com);
}
template<typename Container>
class myback_front_iterator
{
public:
typedef typename Container::value_type T;
myback_front_iterator(Container &Con):con(Con){}
void operator=(const T&val)
{
con.push_front(val);
}
myback_front_iterator<Container>& operator*()
{
return *this;
}
myback_front_iterator<Container>& operator++()
{
return *this;
}
private:
Container &con;
};
template<typename Container>
myback_insert_iterator<Container>myfront_insert(Container &com)
{
return myback_front_iterator<Container>(com);
}
自己实现了一个myfind函数模板
参数给定两个迭代器,用迭代器遍历容器,找到val以后返回val当前所处的迭代器,找不到返回first
template<typename InputIterator,typename T>
InputIterator myfind(InputIterator first,InputIterator last,const T &val)
{
for (;first != last;++first)
{
if (*first == val)
{
return first;
}
}
return last;
}
STL部分的实现的更多相关文章
- 详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
- STL的std::find和std::find_if
std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...
- STL: unordered_map 自定义键值使用
使用Windows下 RECT 类型做unordered_map 键值 1. Hash 函数 计算自定义类型的hash值. struct hash_RECT { size_t operator()(c ...
- C++ STL简述
前言 最近要找工作,免不得要有一番笔试,今年好像突然就都流行在线笔试了,真是搞的我一塌糊涂.有的公司呢,不支持Python,Java我也不会,C有些数据结构又有些复杂,所以是时候把STL再看一遍了-不 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- STL bind1st bind2nd详解
STL bind1st bind2nd详解 先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...
- STL sort 函数实现详解
作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...
- STL的使用
Vector:不定长数组 Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等.而且它在STL中时间效率也很高效:几乎与数组不相上下. #include ...
- [C/C++] C/C++延伸学习系列之STL及Boost库概述
想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...
随机推荐
- 你不知道的getComputedStyle
你不知道的getComputedStyle jQuery的css()的底层实现就用到了getComputedStyle这个方法,也许我们用到的很少,但是不得不说这时一个非常强大的函数,下面让我们一探究 ...
- WinForm 进程、线程
一.进程 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动. 它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体. Process 类,用来操作进程. 命名空间:using Sys ...
- 每日一水之strcmp用法
strcmp函数 C/C++函数,比较两个字符串 设这两个字符串为str1,str2, 若str1==str2,则返回零: 若str1<str2,则返回负数: 若str1>str2,则返回 ...
- 内功心法 -- Java标记接口
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------这篇博客主要来谈谈" ...
- C++编程练习(3)----“实现简单的栈的顺序存储结构“
栈(stack)是限定仅在表尾进行插入和删除操作的线性表. 允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom). 栈又称为后进先出(Last In First Out)的线性表,简 ...
- c++ 继承类强制转换时的虚函数表工作原理
本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解. #include<iostream> using namespace st ...
- iOS RunTime你知道了总得用一下
说点题外话: 我刚来现在这家公司的时候,老板让我下载一个脉脉,上去找找自己的同行,多认识些同行.其实初衷的好的,但最近这两天我把它卸载了,不为别的,负能量太多!iOS这行自从2016就没景气过,在这行 ...
- IP地址和硬件地址 ARP协议
ip地址使用在网络层以上,是一个逻辑地址,物理地址是数据链路层和物理层使用的 在发送数据的时候,数据是从上层往下层发送的,通过tcp报文->ip数据报->mac数据帧 IP地址放在数据报的 ...
- Java数组练习题小结
//2015/07/07 //Java数组小小练习题 /* 3. 写一个函数,计算一个整数数组的平均值 4. 自定义一个整数数组a,读入一个整数n,如果n 在数组中存在,则输出n 的下标:如果不存在, ...
- masm32V11配置
本文写给学汇编语言程序设计刚起步的吧友.适用Windows操作系统.已入门的吧友请绕道. (1)masm32开发包的下载 要用汇编语言编程,首先得有个开发工具,汇编语言开发工具有多种,但本文仅介绍ma ...