模拟了一个向量类:miniVector(参考《数据结构C++语言描述》第五章)
2007-07-02 16:17
288 查看
#include <iostream>
using namespace std;
template <typename T>
class miniVector
{
public:
miniVector( int size = 0 );
miniVector( const miniVector<T>& obj );
~miniVector();
miniVector& operator=( const miniVector<T>& rhs );
T& operator[]( int i );
const T& operator[]( int i ) const;
void push_back(const T& item);
void pop_back();
T& back() const;
int size() const;
int capacity() const;
bool empty() const;
void insert( int i, const T& item );
void erase( int i );
private:
int vSize;
int vCapacity;
T *vArr;
void reserve( int size, bool copy );
};
template <typename T>
void miniVector<T>::reserve( int size, bool copy )
{
T *newArr;
newArr = new T[size];
if( newArr == NULL )
{
cerr << "There is no available memory to allocate!" << endl;
exit( -1 );
}
if( copy )
{
for(int i = 0; i < vSize; i++ )
{
newArr[i] = vArr[i];
}
}
if( vArr != NULL )
delete []vArr;
vArr = newArr;
vCapacity = size;
}
template <typename T>
miniVector<T>::miniVector(int size) :
vSize(0), vCapacity(0), vArr(NULL)
{
if( size < 0 )
{
cerr << "constructor function, the first parameter cannot be assigned to the minus number!" << endl;
exit( -1 );
}
if( size != 0 )
{
reserve( size, false );
vSize = size;
for( int i = 0; i < vSize; i++ )
vArr[i] = T();
}
}
template <typename T>
miniVector<T>::~miniVector()
{
if( vArr != NULL )
delete []vArr;
}
template <typename T>
miniVector<T>::miniVector( const miniVector<T>& obj )
{
if( obj.vCapacity == 0 )
return ;
reserve( obj.vCapacity, false );
for( int i = 0; i < obj.vSize; i++ )
{
vArr[i] = obj.vArr[i];
}
vSize = obj.vSize;
}
template <typename T>
miniVector<T>& miniVector<T>::operator=( const miniVector<T>& rhs )
{
if( this == &ths )
return *this;
if( vArr != NULL )
{
delete []vArr;
reserve( rhs.vCapacity, false );
for( int i = 0; i < rhs.vSize; i++ )
{
vArr[i] = rhs.vArr[i];
}
vSize = rhs.vSize;
}
else
{
vSize = 0;
vCapacity = 0;
}
}
template <typename T>
T& miniVector<T>::operator[]( int i )
{
if( i < 0 || i > vSize -1 )
{
cerr << i <<" is not in the scale of miniVector! " << endl;
exit( -1 );
}
return vArr[i];
}
template <typename T>
const T& miniVector<T>::operator[]( int i ) const
{
if( i < 0 || i > vSize -1 )
{
cerr << i <<" is not in the scale of miniVector! " << endl;
exit( -1 );
}
return vArr[i];
}
template <typename T>
void miniVector<T>::push_back( const T& item )
{
if( vSize == vCapacity )
{
if( vCapacity == 0 )
reserve( 1, false );
else
reserve( 2 * vCapacity, true );
}
vArr[vSize] = item;
vSize++;
}
template <typename T>
void miniVector<T>::pop_back()
{
if( empty() )
{
cerr << " miniVector is empty, you cannot get the value!" << endl;
exit( -1 );
}
vSize--;
}
template <typename T>
T& miniVector<T>::back() const
{
if( empty() )
{
cerr << " miniVector is empty, you cannot get the value!" << endl;
exit( -1 );
}
return vArr[vSize-1];
}
template <typename T>
int miniVector<T>::size() const
{
return vSize;
}
template <typename T>
int miniVector<T>::capacity() const
{
return vCapacity;
}
template <typename T>
bool miniVector<T>::empty() const
{
if( vSize == 0 )
return true;
else
return false;
}
template <typename T>
void miniVector<T>::insert( int i, const T& item )
{
if( i == vSize )
push_back( item );
else if( i > vSize )
{
cerr << i <<" is not in the scale of miniVector!" << endl;
exit(-1);
}
else
{
if( vSize == vCapacity )
{
if( vCapacity == 0 )
reserve( 1, false );
else
reserve( 2 * vCapacity, true );
}
int j;
for( j = vSize; j >= 0; j-- )
{
if( j == i )
break;
vArr[j] = vArr[j-1];
}
vArr[j] = item;
++vSize;
}
}
template <typename T>
void miniVector<T>::erase( int i )
{
if( i < 0 || i > vSize - 1 )
{
cerr << i << " is not in the scale of miniVector!" << endl;
exit(-1);
}
if( i == vSize - 1 )
{
pop_back();
}
else
{
int j;
for( j = i + 1; j < vSize; j++ )
{
vArr[j - 1] = vArr[ j ];
}
--vSize;
}
}
template <typename T>
void insertOrder( miniVector<T>& v, const T& item )
{
int i;
for( i = 0; i < v.size(); i++ )
{
if( item < v[i] )
break;
}
v.insert( i, item );
}
template <typename T>
void removeDuplicates( miniVector<T>& v )
{
for( int i = 1; i < v.size(); i++ )
{
if( v[i] == v[i-1] )
{
v.erase( i );
--i;
}
}
}
using namespace std;
template <typename T>
class miniVector
{
public:
miniVector( int size = 0 );
miniVector( const miniVector<T>& obj );
~miniVector();
miniVector& operator=( const miniVector<T>& rhs );
T& operator[]( int i );
const T& operator[]( int i ) const;
void push_back(const T& item);
void pop_back();
T& back() const;
int size() const;
int capacity() const;
bool empty() const;
void insert( int i, const T& item );
void erase( int i );
private:
int vSize;
int vCapacity;
T *vArr;
void reserve( int size, bool copy );
};
template <typename T>
void miniVector<T>::reserve( int size, bool copy )
{
T *newArr;
newArr = new T[size];
if( newArr == NULL )
{
cerr << "There is no available memory to allocate!" << endl;
exit( -1 );
}
if( copy )
{
for(int i = 0; i < vSize; i++ )
{
newArr[i] = vArr[i];
}
}
if( vArr != NULL )
delete []vArr;
vArr = newArr;
vCapacity = size;
}
template <typename T>
miniVector<T>::miniVector(int size) :
vSize(0), vCapacity(0), vArr(NULL)
{
if( size < 0 )
{
cerr << "constructor function, the first parameter cannot be assigned to the minus number!" << endl;
exit( -1 );
}
if( size != 0 )
{
reserve( size, false );
vSize = size;
for( int i = 0; i < vSize; i++ )
vArr[i] = T();
}
}
template <typename T>
miniVector<T>::~miniVector()
{
if( vArr != NULL )
delete []vArr;
}
template <typename T>
miniVector<T>::miniVector( const miniVector<T>& obj )
{
if( obj.vCapacity == 0 )
return ;
reserve( obj.vCapacity, false );
for( int i = 0; i < obj.vSize; i++ )
{
vArr[i] = obj.vArr[i];
}
vSize = obj.vSize;
}
template <typename T>
miniVector<T>& miniVector<T>::operator=( const miniVector<T>& rhs )
{
if( this == &ths )
return *this;
if( vArr != NULL )
{
delete []vArr;
reserve( rhs.vCapacity, false );
for( int i = 0; i < rhs.vSize; i++ )
{
vArr[i] = rhs.vArr[i];
}
vSize = rhs.vSize;
}
else
{
vSize = 0;
vCapacity = 0;
}
}
template <typename T>
T& miniVector<T>::operator[]( int i )
{
if( i < 0 || i > vSize -1 )
{
cerr << i <<" is not in the scale of miniVector! " << endl;
exit( -1 );
}
return vArr[i];
}
template <typename T>
const T& miniVector<T>::operator[]( int i ) const
{
if( i < 0 || i > vSize -1 )
{
cerr << i <<" is not in the scale of miniVector! " << endl;
exit( -1 );
}
return vArr[i];
}
template <typename T>
void miniVector<T>::push_back( const T& item )
{
if( vSize == vCapacity )
{
if( vCapacity == 0 )
reserve( 1, false );
else
reserve( 2 * vCapacity, true );
}
vArr[vSize] = item;
vSize++;
}
template <typename T>
void miniVector<T>::pop_back()
{
if( empty() )
{
cerr << " miniVector is empty, you cannot get the value!" << endl;
exit( -1 );
}
vSize--;
}
template <typename T>
T& miniVector<T>::back() const
{
if( empty() )
{
cerr << " miniVector is empty, you cannot get the value!" << endl;
exit( -1 );
}
return vArr[vSize-1];
}
template <typename T>
int miniVector<T>::size() const
{
return vSize;
}
template <typename T>
int miniVector<T>::capacity() const
{
return vCapacity;
}
template <typename T>
bool miniVector<T>::empty() const
{
if( vSize == 0 )
return true;
else
return false;
}
template <typename T>
void miniVector<T>::insert( int i, const T& item )
{
if( i == vSize )
push_back( item );
else if( i > vSize )
{
cerr << i <<" is not in the scale of miniVector!" << endl;
exit(-1);
}
else
{
if( vSize == vCapacity )
{
if( vCapacity == 0 )
reserve( 1, false );
else
reserve( 2 * vCapacity, true );
}
int j;
for( j = vSize; j >= 0; j-- )
{
if( j == i )
break;
vArr[j] = vArr[j-1];
}
vArr[j] = item;
++vSize;
}
}
template <typename T>
void miniVector<T>::erase( int i )
{
if( i < 0 || i > vSize - 1 )
{
cerr << i << " is not in the scale of miniVector!" << endl;
exit(-1);
}
if( i == vSize - 1 )
{
pop_back();
}
else
{
int j;
for( j = i + 1; j < vSize; j++ )
{
vArr[j - 1] = vArr[ j ];
}
--vSize;
}
}
template <typename T>
void insertOrder( miniVector<T>& v, const T& item )
{
int i;
for( i = 0; i < v.size(); i++ )
{
if( item < v[i] )
break;
}
v.insert( i, item );
}
template <typename T>
void removeDuplicates( miniVector<T>& v )
{
for( int i = 1; i < v.size(); i++ )
{
if( v[i] == v[i-1] )
{
v.erase( i );
--i;
}
}
}
相关文章推荐
- 一个简单的矩阵类的实现(参照《数据结构C++语言描述》第五章)
- 【阅读】《head first jquery》第五章——jquery效果与动画(一个变脸的小例子)
- SWARM—一个支持人工生命建模的面向对象模拟平台
- 分享一个模拟各种分辨率的网页
- 《招聘一个靠谱的iOS》面试题参考答案(上)
- arcgis-“一个或多个已经添加图层的范围与关联空间参考不一致”“Arcmap不能绘制一个或者多个图层”
- sharepoint域认证的时候给用户一个友好的登陆界面(windows认证模拟登陆)
- 用python模拟一个文本浏览器来抓取网页
- 3.3-多个栈组合模拟一个栈
- SQL学习笔记[1] - 防注入攻击:一个参数传值+模糊查询的参考写法
- CCF计算机软件能力认证模拟试题参考答案(JAVA)(201703 1+2)
- Axis+Tomcat模拟一个银行存取款
- Appache一个ip配置多个域名方案(参考韩顺平的视频教程)
- C# 二进制序列化(BinaryFormatter),Xml序列化(XmlSerializer),自己模拟写一个Xml序列化过程。
- 用两个栈模拟一个队列
- 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
- 【学习点滴-数据结构-栈&队列】 用两个队列模拟一个栈
- 一个很不错的——Ruby参考手册及附加库等资料站点
- ATM:模拟实现一个ATM + 购物商城程序
- Struts学习总结(三)---使用Struts实现一个模拟前后台的注册功能实现。