标题:大家一起来写STL
只看楼主
shower
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2006-4-29
 问题点数:0 回复次数:11 
大家一起来写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
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
得分:0 
不知道你这个old_data在这里有什么作用!再着它只是一个指针没有用new来分配内存,为什么要用delete来对付它呢!

=×&D o I p R e E n C g T l X&×=
2007-02-16 00:13
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
得分:0 

#include "iostream.h"
#include "stdio.h"

int main(){
char* data;
char* new_data;
char* old_data;

old_data = data;
new_data = new char[20];
data =new_data;
delete old_data; // 这时一定会报错误,因为当时的data还没有用new来分配内存
return 0;
}

看第二种
int main(){
char* data;
char* new_data;
char* old_data;


new_data = new char[20];
data =new_data;
old_data = data; // 这时就不会报错误了.
delete old_data;
return 0;
}


=×&D o I p R e E n C g T l X&×=
2007-02-16 00:38
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
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
得分:0 
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;

delete[] data;
data=new_data;
finish++;
end_of_storage*=2;

//start remain the same
//delete
//delete []old_data;
}
}


=×&D o I p R e E n C g T l X&×=
2007-02-16 13:14
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 
以下是引用shower在2007-2-16 12:42:00的发言:

我是这样想的:请看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
}//你这只给一个值,为什么不用PUSH完成呢,很费解啊,不如把这个函数改成初始化全部数组的函数

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
以上是我的想法,我没有看出有什么错误。请你帮我指明!谢谢你!

//思路很对啊


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-02-16 13:22
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
得分:0 
的确!没看见它是用()的!

=×&D o I p R e E n C g T l X&×=
2007-02-16 13:32
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 
呵呵
你还上学么??
楼上,很想认识你

[此贴子已经被作者于2007-2-16 13:49:35编辑过]


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-02-16 13:35
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
得分:0 
你说我吗?

=×&D o I p R e E n C g T l X&×=
2007-02-16 13:50
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 

呵呵
老人了 ,却一直幕后

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-02-16 13:57



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




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

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