标题:大家一起来写STL
取消只看楼主
shower
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2006-4-29
 问题点数:0 回复次数:2 
大家一起来写STL
大家好,我是一名大二的学生。我学的是软件工程。我们上学期学的是数据结构,下学期学算法。我想多多练习总是没有错的,于是有自己连编写STL的冲动。STL是一个很好的数据结构与算法的集合。我手上有《STL源码剖析》(by候健),我一边学一边编。很希望和大家一起交流,如果有兴趣,请发邮件到shao_wen_buaa@163.com.
另外我还有个问题:
我在写vector的时候遇到这样的问题:
template<typename T>
void SW_Vector<T>::push_back(const T& x)//insert x at the end of the vector
{
if (!full())
{
data[finish++]=x;
}
else
{
int i;
T* new_data;
T* old_data;
old_data=data;
new_data=new T(2*size());
//copy the old values
for (i=start;i<finish;i++)
{
new_data[i]=data[i];
}
new_data[i]=x;

data=new_data;
finish++;
end_of_storage*=2;

//start remain the same
//delete
delete []old_data; //*********************
}
}
这个函数把x插入到vector后面,但是到*******的句子总是出内存错误,我把它改成delete old_data,也不成,不知道为什么。请高人指点~~!
谢谢你!
搜索更多相关主题的帖子: STL 
2007-02-15 19:45
shower
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2006-4-29
得分:0 

我是这样想的:请看vector的初始化:
版本1:
SW_Vector<T>::SW_Vector(int n)//constructor, given size n
{
start=0;
finish=0;
end_of_storage=n;
data=new T(n);
}

版本2:
template<typename T>
SW_Vector<T>::SW_Vector(int n,const T& value)//constructor, given size n and the initializing value
{
fill_initialize(n,value);
}

plate<typename T>
void SW_Vector<T>::fill_initialize(int n, const T& value)//initializing and fill in the first value
{
start=0;//initializing
finish=1;
end_of_storage=n;
data=new T(n); //allocate
data[start]=value; //fill in
}

data是动态分配分配的!我们用data[0,n-1]来表示。我们再看push_back这个函数:
template<typename T>
void SW_Vector<T>::push_back(const T& x)//insert x at the end of the vector
{
if (!full())
{
data[finish++]=x;
}
else
{
int i;
T* new_data;
T* old_data;
old_data=data;
new_data=new T(2*size());
//copy the old values
for (i=start;i<finish;i++)
{
new_data[i]=data[i];
}
new_data[i]=x;

data=new_data;
finish++;
end_of_storage*=2;

//start remain the same
//delete
delete []old_data;
}
}
首先:data是需要delete的!push_back中的else部分是来处理空间不够的情况的!我先把old_data指向data,此时old_data便指向一个大小为n的空间。然后申请一个new_data指向一个两倍大的空间,然后进行复制。接着把data指向这个新申请的空间。然后需要delete原来data的空间,这片空间是用old_data来标记的,所以我就用了delete []old_data
以上是我的想法,我没有看出有什么错误。请你帮我指明!谢谢你!


2007-02-16 12:42
shower
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2006-4-29
得分:0 

哦,谢了哦,踏魔狼的的确更好。
谢谢~~~!


2007-02-16 16:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-121047-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.538721 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved