在C++primer练习写的vector类有问题

physics1988 2009-04-23 05:21:28
题目要求是自己写一个vector类,我下了如下

#ifndef MYVECTOR_H
#define MYVECTOR_H
#include<memory>
#include<cstddef>
using namespace std;

template<class T> class Vector{
public:
typedef T* iterator;
Vector():elements(0),first_free(0),end(0){}
void push_back(const T&);
void reserve(const size_t capa);

//调整Vector大小,使其能容纳n个元素;
//如果n小于Vector当期大小,则删除多余元素;
//否则,添加采用值初始化的新元素
void resize(const size_t n);

//调整Vector大小,使其能容纳n个元素;所有新添加的元素值为t
void resize(const size_t n,const T& t);

//下标操作符
T& operator [] (const size_t);
const T& operator [] (const size_t) const;

//返回Vector的大小
size_t size(){
return first_free-elements;}

//返回Vector容量
size_t capacity(){
return end-elements;}
//返回指向第一个元素的迭代器
iterator begin(){
return elements;
}
//返回指向最后一个元素的下一位置的迭代器
iterator last(){
return first_free;
}
private:
static std::allocator<T> alloc; //用于获取未构造内存的对象
void reallocate(); //获取更多空间并复制现有的元素
T* elements; //指向第一个元素的指针
T* first_free; //指向第一个自由元素的指针
T* end; //指向数组末端的下一元素位置的指针
};
template<class T> allocator<T> Vector<T>::alloc; //在类外对static文件进行初始化
template<class T>
void Vector<T>::push_back(const T & t){
if(elements==end) //当前数组已满,先分配额外空间
reallocate();
alloc.construct(first_free,t);
first_free++;
}
template<class T>
void Vector<T>::reserve(const size_t capa){
T* newelements=alloc.allocate(capa); //为新数组构造内存空间
size_t tempsize=size(); //暂存原来数组的大小
if(size()>capa)
uninitialized_copy(elements,first_free-size()+capa,newelements);
else
uninitialized_copy(elements,first_free,newelements);
for(T* p=elements;p!=first_free;) //先析构原来数组的对象
alloc.destroy(p++);
alloc.deallocate(elements,capacity()); //释放原来数组的空间
elements=newelements;
first_free=elements+min(tempsize,capa);
end=elements+capa;
}
template<class T>
T& Vector<T>::operator [] (const size_t index){
if(index>size())
throw std::runtime_error("out of range");
else
return elements[index];
}
template<class T>
const T& Vector<T>::operator [](const size_t index) const {
if(index>size())
throw std::runtime_error("out of range");
else
return const elements[index];
}
template<class T>
void Vector<T>::resize(const size_t n){
//计算当前的大小及容量
size_t size=first_free-elements;
size_t capacity=end-elements;

if(capacity<n){
reallocate(); //获取更多的空间并复制现有的元素
uninitialized_fill(newelements+size,newelemnts+n,T());//添加采用值初始化的新元素
}
else if (n>size)
//添加采用值初始化的新元素
uninitialized_fill(newelements+size,newelemnts+n,T());
else {for(T* p=elements+n;p!=first_free;)
alloc.destroy(p++);}
//使数据结构指向新元素
first_free=elements+n;
}
template<class T>
void Vector<T>::resize(const size_t n,const T& t){
//计算当前的大小及容量
size_t size=first_free-elements;
size_t capacity=end-elements;

if(capacity<n){
reallocate(); //获取更多的空间并复制现有的元素
uninitialized_fill(newelements+size,newelemnts+n,t);//添加采用值初始化的新元素
}
else if (n>size)
//添加采用值初始化的新元素
uninitialized_fill(newelements+size,newelemnts+n,t);
else {for(T* p=elements+n;p!=first_free;)
alloc.destroy(p++);}
//使数据结构指向新元素
first_free=elements+n;
}
template<class T>
void Vector<T>::reallocate(){
size_t size=first_free-elements;
size_t newcapacity=2*(1>capacity()?1:capacity());//大小以当前两倍的速度增长
T* newelements=alloc.allocate(newcapacity);
//先将旧的元素赋给新指针
uninitialized_copy(elements,first_free,newelements);
//释构旧的内存空间
for(T* p=elements;p!=first_free;)
alloc.destroy(p++);
//不能在值为0的指针进行析构
if(elements)
//返回旧的内存空间
alloc.deallocate(elements,end-elements);
elements=newelements;
first_free=elements+size;
end=elements+newcapacity;
}
#endif

//cpp文件
#include "Vector.h"
#include<iostream>
using namespace std;
int main(){
int i;
Vector<int> ival;
while(cin>>i)
ival.push_back(i);
for(Vector<int>::iterator iter=ival.begin();iter!=ival.last();iter++)
cout<<*iter<<endl;
return 0;
}

编译没问题,但是输入超过4个数以后就不行了,还有一个问题希望高手赐教,就是在VS2005下如何象在VC6下插入断点进行调试,因为程序在VC6过不了,我在VS2005上又不会调试只好发上来了,希望各位高手帮帮忙
...全文
112 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
physics1988 2009-04-23
  • 打赏
  • 举报
回复
void Vector <T>::push_back(const T & t){ 
if(elements==end) //满的条件应该是if( first_free == end ),而不是(elements==end)
reallocate();
alloc.construct(first_free,t);
first_free++;
}
physics1988 2009-04-23
  • 打赏
  • 举报
回复
问题已解决。谢谢2楼教给我的调试方法
cyldf 2009-04-23
  • 打赏
  • 举报
回复

template <class T> allocator <T> Vector <T>::alloc; //在类外对static文件进行初始化
template <class T>
void Vector <T>::push_back(const T & t){
if(elements==end) //此处判断vector满的条件应该是if( first_free == end )
reallocate();
alloc.construct(first_free,t);
first_free++;
}

  • 打赏
  • 举报
回复
这么长,帮顶..
herman~~ 2009-04-23
  • 打赏
  • 举报
回复
MARK
lingyin55 2009-04-23
  • 打赏
  • 举报
回复
在VS2005下如何象在VC6下插入断点进行调试

在代码行的左边灰色部分右击可以设置断点,或者右击要设置断点的代码行,选择插入断点。

程序没看出什么问题,等会再看,你也可以自己参考下stl中vector的实现,有源码的。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧