- 浏览: 429979 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
su6838354:
我有点疑问啊,thread1中的i自增的慢的话,thread2 ...
浅析pthread_cond_wait -
zeronever:
请问pthread_cond_signal有解锁操纵吗?我在p ...
浅析pthread_cond_wait -
paladin1988:
你这帖子真心不错。。
浅谈bitmap算法 -
parabellum_sky:
昨天还有个姑娘让我去考我说会考虑
个人日志
Vector模板
这几天自己写了一个Vector模板,但是遇到一些问题:如何把.h和.cpp文件分开来写?模板的语法是什么?
1.下面是在一个.cpp文件中实现模板
#include <iostream> using namespace std; template <typename Object> class Vector { public: //explicit Vector( int initSize = 0 ) // : theSize( initSize ), theCapacity( initSize + SPARE_CAPACITY ) //{ objects = new Object[ theCapacity ]; } //explicit Vector(int initSize = 0) Vector(int initSize = 0) { theSize = initSize; theCapacity = initSize + SPARE_CAPACITY; objects = new Object[ theCapacity ]; } Vector( const Vector & rhs ) : objects( NULL ) { cout << "Call Copy constructor!"<< endl; operator=( rhs ); } ~Vector( ) { delete [ ] objects; } const Vector & operator= ( const Vector & rhs ) { cout << "Call Operator Constructor!" << endl; if( this != &rhs ) { delete [ ] objects; theSize = rhs.size( ); theCapacity = rhs.theCapacity; objects = new Object[ capacity( ) ]; for( int k = 0; k < size( ); k++ ) objects[ k ] = rhs.objects[ k ]; } return *this; } void resize( int newSize ) { if( newSize > theCapacity ) reserve( newSize * 2 + 1 ); theSize = newSize; } void reserve( int newCapacity ) { if( newCapacity < theSize ) return; Object *oldArray = objects; objects = new Object[ newCapacity ]; for( int k = 0; k < theSize; k++ ) objects[ k ] = oldArray[ k ]; theCapacity = newCapacity; delete [ ] oldArray; } Object & operator[]( int index ) { return objects[ index ]; } const Object & operator[]( int index ) const { return objects[ index ]; } bool empty( ) const { return size( ) == 0; } int size( ) const { return theSize; } int capacity( ) const { return theCapacity; } void push_back( const Object & x ) { if( theSize == theCapacity ) reserve( 2 * theCapacity + 1 ); objects[ theSize++ ] = x; } void pop_back( ) { theSize--; } const Object & back ( ) const { return objects[ theSize - 1 ]; } typedef Object * iterator; typedef const Object * const_iterator; iterator begin( ) { return &objects[ 0 ]; } const_iterator begin( ) const { return &objects[ 0 ]; } iterator end( ) { return &objects[ size( ) ]; } const_iterator end( ) const { return &objects[ size( ) ]; } enum { SPARE_CAPACITY = 16 }; private: int theSize; int theCapacity; Object * objects; }; int main() { Vector<int> Temp(10); Vector<int> b; b = Temp; Temp.push_back(10); Temp.push_back(20); Temp.reserve(4); cout << Temp.size() << endl; return 0; }
但是我想分开来写却遇到很多错误。
在Essential C++ 中看到要这样写:
2.分开.h和.cpp实现
// #ifndef VECTOR_H_ #define VECTOR_H_ template <typename Object> class Vector { public: enum{SPACE_CAPACITY =16}; Vector(int ); Vector(const Vector & rhs); ~Vector(); //const Vector & operator= (const Vector & rhs); Vector & operator= (const Vector & rhs); void resize(int newSize); void reserve(int newCapacity); Object & operator[](int index); const Object & operator[](int index)const; bool empyt()const; Object size() const; Object capacity() const; void pop_back(); void push_back(const Object & x); const Object & back() const; private: int theSize; int theCapacity; int *objects; }; #endif
//2011 06 28 #include <iostream> using namespace std; #include "Vector.h" template <typename Object> inline Vector<Object>::Vector(int initSize = 0):theSize(initSize),theCapacity(initSize + SPACE_CAPACITY) { objects = new Object[theCapacity]; } //Copy constructor template <typename Object> inline Vector<Object>::Vector(const Vector & rhs):objects(NULL) { operator=(rhs); } //Deconstructor template <typename Object> Vector<Object>::~Vector() { delete [] objects; } //assignment Constructor template <typename Object> Vector<Object> & Vector<Object>::operator=(const Vector & rhs) { cout <<"Call operator Constructor!"<< endl; if(this != &rhs) { delete[] objects; theSize = rhs.size(); theCapacity = rhs.capacity(); objects = new Object[capacity()]; //synamical allocate memory for(int k = 0; k < size();k++) objects[k] = rhs.objects[k]; } return *this; } template<typename Object> void Vector<Object>::resize(int newSize) { if(newSize > theCapacity) reserve(2*newSize + 1); theSize = newSize; } template<typename Object> void Vector<Object>::reserve(int newCapacity) { if(newCapacity < theSize) return; Object *oldArray = objects; objects = new Object[ newCapacity ]; for( int k = 0; k < theSize; k++ ) objects[ k ] = oldArray[ k ]; theCapacity = newCapacity; delete [ ] oldArray; } // template <typename Object> Object & Vector<Object>::operator [](int index) { return objects[index]; } // template <typename Object> const Object & Vector<Object>::operator [](int index) const { return objects[index]; } template<typename Object> bool Vector<Object>::empyt()const { return size() == 0; } template <typename Object> Object Vector<Object>::size() const { return theSize; } template <typename Object> Object Vector<Object>::capacity() const { return theCapacity; } template<typename Object> void Vector<Object>::push_back(const Object & x) { if(theSize == theCapacity) reserve(2*theSize +1); objects[theSize++] = &x; } template <typename Object> void Vector<Object>::pop_back() { theSize--; } template <typename Object> const Object & Vector<Object>::back() const { return objects[theSize - 1]; } int main(void) { Vector<int> Temp(10); return 0; }
发表评论
-
Google编程风格
2012-04-01 17:05 1073Google编程风格(自己整 ... -
VS2008快捷键的设置
2012-02-02 13:43 2611VS2008快捷键的设置 VS2008默认的快捷键和VC++ ... -
LINK : fatal error LNK1000: Internal error during IncrBuildImage
2011-12-16 17:07 1187Win7安vc2008编译报LINK : fatal erro ... -
volatile关键字(摘自:百度百科)
2011-12-16 14:59 701volatile关键字[align=center][/alig ... -
InterlockedIncrement
2011-12-16 14:44 2147InterlockedIncrement[align=cent ... -
关键词explicit
2011-12-10 20:32 823关键词explicit[size=large][/size][ ... -
Souce Insight 设置
2011-12-09 17:16 1954Souce Insight 设置 【问题】 Source I ... -
VS2008下Boost库的安装编译下载boost库
2011-11-09 19:19 2011下载boost库 (最好去官网下,一般有SGI(GCC+用的较 ... -
C++多态技术的实现和反思(转)
2011-10-17 17:05 774面向对象技术最早出现于1960年代的Simula 67系统,并 ... -
memmove and memcpy
2011-07-31 13:11 1152memmove and memcpy 字符串的拷贝函数mem ... -
Polymorphism & Virtual Function
2011-07-25 21:38 826Polymorphism & Virtual Func ... -
C++ 不要重新定义继承的非虚函数
2011-07-18 14:15 1268不要重新定义继承的非虚函数 如果基类和派生类有相同的非虚函数 ... -
C++ 虚函数表解析
2011-07-14 21:02 947C++ 虚函数表解析 为什么在C++机制里要有虚函数表?虚函 ... -
C++ 默认构造函数
2011-07-14 11:39 3692C++ 默认构造函数 一直 ... -
尽量使用const
2011-07-12 10:51 1080尽可能的使用const const: ... -
Operator=
2011-07-11 21:54 912Operator= 赋值构造函数 ... -
虚析构函数
2011-07-11 10:43 1134虚析构函数 一 、为何要单独讨论虚析构函数?虚函数在类中到底 ... -
初始化列表和声明顺序之间的关系
2011-07-11 09:18 1442初始化列表和声明的顺序之间的关系 类中数据成员的声明顺序和初 ... -
初始化函数列表和构造函数内赋值之区别
2011-07-10 17:05 4471初始化函数列表和构造 ... -
传值和传引用的区别
2011-07-10 15:30 2348传值和传引用的区别 在C语言中,大都是通过值传递,C++也是 ...
相关推荐
c++写的k均值算法 里面有部分的输出调试语句 用了很多vector模板操作
使用C++模板类对vector的重写,支持STLvector的一般操作和溢出处理,对STLvector的理解有帮助
运用stl编写的学生管理系统,在百度上拿过来的~
关于C++STL模板库Vector的基本操作函数的介绍与用法举例
编程语言:C++ 实现功能:自定义实现的Vector类 参考方向:C++泛化模板编程 C++初学者参考学习
简易版vector,用模板类实现。实现函数有:capacity,reserve,push_back,pop_back,size,swap,empty,clear,erase。
C++中标准模板库中vector容器的基本概念与基本操作
c++ vector用法 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。要解决此问题我们自己实现这样的类。在标准C++中,用容器向量(vector)实现。容器向量也是一个类模板。 标准库vector类型使用需要的...
使用C++类模板实现的std::vector容器。 对于学习动态数组有很大的帮助。
一个比较好的C++的标准模板库.主要包含C++的标准模板库中的容器和算法的类库。主要包含STL中比较常用的容器是vector,set和map,比较常用的算法有Sort等。
C++标准模板库源代码主要涉及下面几个内容: vector 向量 deque 双端队列 list 链表 map 映射 multiset 多重集合 queue 队列 set 集合 stack 堆栈。
vector list map pair stl 标准模板库 c++ 程序示例
向量vector是一种随机访问的数组类型,提供了对数组元素的快速、随机访问以及在序列尾部快速、随机的插入和删除操作。它是大小可变的向量,在需要是可以改变其大小。 形式:
组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的几个头文件:、<vector>、、、、、、、、、、、和。文件中主要介绍了前面八个的使用,并且重点介绍了他们的属性和一些成员函数的使用。
C++期末考试可能会考到的代码 类 类模板 模拟STL中的向量,支持用push.back()操作向Vector中加入对象,具有自动resize功能 迭代器
仿写C++ STL标准库 vector 源码,可直接在cpp文件中调用实现
C++中数组很坑,有没有类似Python中list的数据类型呢?类似的就是vector! vector 是同一种类型的对象的集合 ,每个对象都有一...vector 是一个类模板(class template)。使用模板可以编写一个类定义或函数定义,而用
利用C++模板完成容器Vector类的简单功能实现,如迭代器等
本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解。具体内容如下: 泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上...
vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。 特别注意: 使用vector需要注意以下几点: 1、如果你要表示的向量长度较长(需要为向量内部保存很多数),...