在C++Bulider中如何实现动态改变数组大小?(100分)

  • 主题发起人 主题发起人 cnma
  • 开始时间 开始时间
C

cnma

Unregistered / Unconfirmed
GUEST, unregistred user!
我知道在Delphi中,可以用Setlegth函数动态改变数组大小,但在C++Bulider中我没有找到
类似的函数,请问在C++Bulider中如何实现动态改变数组大小(如果没有函数,讲一下思路
也可以)?Thank!
 
你的动态数组是怎么实现的呢?
 
我一般用STL的vector,c++中更方便些。
 
对,在C++中还是尽量使用STL,所以有很多选择
vector是很常用的
 
DynamicArray<int> a;
//a为一动态数组
a.Length = 10;
//a的长度为10
a.Length = 0;
//a的长度为 0
 
vector <vector <POINT> > array1;
const int array1size=5;
array1.resize(array1size);//定义长度5;
for(int i=0;i<array1size;i++)
array1.resize(5);//定义为5*5的二位数组
。。。。。。。
array1size=19;
array1.resize(array1size);//定义长度19;
。。。。。。。
就这么简单,而且这个数组是二维的!!
第二种方法:
DynamicArray<TObjeto> Objetos;
int yourlength=12;
Objetos.Length = yourlength;
 
DynamicArray<int> ia;
ia.set_length(10);
//分配内存
ia.set_length(0);
//释放内存
 
可以用指针,需要多少动态分配多少。
 
有这么复杂吗?
假设char类型
char *temp;
假设需要10个
temp=new char[10];
释放
delete []temp;
建议您看一下 <<数据结构算法与应用-C++语言描述>>
chinapub cd4 上有电子版
没有我mail给你相关章节
 
mamaha:
>>假设需要10个
问题就是不知道需要10个!要动态增长.
 
可以用两种方法来实现的:
1.
DynamicArray<int>i;
i.Length = 12;
2.
int size = 12;
int *i =new int[size];
 
gmxyb:
是动态增长呀
算了 正好以前写过 类似的代码
column 是一维数组的类 虽然我添加了很多成员函数
因为我下一步 需要column的数组
在程序运行中 column类的变量长度 随时可能增大或减小
代码质量一般 见笑了[:(]
但是本质上是一维动态数组

//定义column的类和方法
class cColumn
{
public:
cColumn(int size=0);
~cColumn();
void cColumnAddAnswer(char *p);
void cColumnRemoveAnswer(char *p);
void cColumnReplace(char *p);
char* cColumnReturn();
char &amp;
operator[](int i) const;
cColumn &amp;
operator=(const cColumn &amp;v);
int cColumnSize();
bool cColumnInclude(char p);
private:
int size;
char *Answers;
};
char &amp;
cColumn::operator[](int i)const
{
if(i<0||i>size)ShowMessage("something wrong");
return Answers;
}
cColumn &amp;cColumn::operator=(const cColumn &amp;v)
{
if(this !=&amp;v)//非自我赋值
{
size=v.size;
ShowMessage(v.size);
delete []Answers;
Answers=new char[size];
for(int i=0;i<size;i++)
Answers=v.Answers;
}
Answers[size]='/0';
return *this;
};
cColumn::cColumnSize()
{
return size;
}
bool cColumn::cColumnInclude(char p)
{
if (strchr(Answers,p))
{return true;}
else
{return false;}
}
cColumn::cColumn(int sz)
{
if(sz<0)ShowMessage("Something error");
size=sz;
Answers=new char[sz];
};
cColumn::~cColumn()
{
delete []Answers;
};
void cColumn::cColumnReplace(char *p)
{
delete []Answers;
Answers=new char[strlen(p)];
size=strlen(p);
strcpy(Answers,p);
};
void cColumn::cColumnAddAnswer(char *p)
{
for(register int j=0;j<(int)strlen(p);j++)
{
if (!strchr(Answers,p[j]))
{
char *temp;
temp=strdup(Answers);
delete []Answers;
Answers=new char[size++];
strcpy(Answers,temp);
Answers[size-1]=p[j];
delete []temp;
}
}
};
void cColumn::cColumnRemoveAnswer(char *p)
{
for(register int j=0;j<(int)strlen(p);j++)
{
if (strchr(Answers,p[j]))
{
char *temp,*temp2;
temp=new char[size];
temp2=strdup(strchr(Answers,p[j]));
for (int i=0;i<(size-(int)strlen(temp2));i++)
temp=Answers;
temp[size-(int)strlen(temp2)]='/0';
delete []Answers;
Answers=new char[size--];
strcpy(Answers,temp);
for (int i=size;i>(int)strlen(temp);i--)
Answers[i-1]=temp2[i-(int)strlen(temp)];
Answers[size]='/0';
delete []temp;
delete []temp2;
}
}
};
char *cColumn::cColumnReturn()
{
return Answers;
}
 
用malloc();free();realloc();可以实现,先用malloc分配一个一维指针数组,以后用realloc改
变长度,同样的方法用malloc分配数组让刚才的指针指向现在分配的即可,同样可以用realloc改大小
这种实现不光数组是动态增长,连数组的内容也可以不同长度。
eg.
int length=10,i;
char **p;
*p=malloc(10);
for(i=0;i<length;i++){
p=malloc(看你需要有多长);
}
如果要变,则
*p=relloc(参数我忘了,总之可以改大小);
我这方法不仅适用与C++,C也是适用的。[8D]
 
在BCB中,Length是DynamicArray的变量,不是函数,所以找不到类似Delphi的SetLength方法,zz99,zbc的方法是正解
 
多人接受答案了。
 
后退
顶部