树组的问题!(100分)

  • 主题发起人 主题发起人 lifangchao2008
  • 开始时间 开始时间
L

lifangchao2008

Unregistered / Unconfirmed
GUEST, unregistred user!
如何查找数组!
如何插入数组!
如何删除数组!
请各位帮帮忙!!!!!!!!!!!!
 
数组是我们在编程过程中经常使用的对象,而有些数组的大小是不确定的,我们称之为不定长数组(或变长数组).不定长数组的操作给我们带来了众多的不便,例如:

在编程中,我们通常使用new来分配一个存储块来存储数据.下面的语句是分配一个存储100个整数的内存块.

int * nItems=new int[100]


如果我们在程序中为这个数组填充了数据,但又发现填充的整数又不止100个,可以使用下面的语句重新分配存储空间.

delete nItems

int* pnItems=new int[NewSize]


这样操作会导致:丢失原先数组中保存的数据!在C++Builder中,可以使用标准模板库提供的vector类对不定长数组进行操作,并避免上述问题。

标准模板库(STL)是标准C++库中的一部分,它包含了几乎编制所有程序和系统所需要的类属。标准模板库是基于模板的实用类库。在标准模板库中没有图形、组件或其他的什么。这是为了使用户能以更简单多样的方式使用多样的数据。标准模板库提供了可移植的字符串类(String类)、数组(在STL术语中称为矢量)、链表(单向和双向)、对列、映射(象字典一样的东西)和其他标准数据结构的完整体现。

在STL中,变量数组是由vector类来表示的,它允许程序员以顺序或随机的方式访问任意类型的项(每个vector对象只有一种单一类型).下面罗列了vector类中常用的方法:

insert 在数组中添加新的元素
size 返回数组中元素的个数
[] 为数组编写索引,返回数组中某个元素以便读写
=(vector) 数组间的复制
at 与运算符[]相同
begin 返回数组的头部
end 返回数组的尾部
capacity 返回数组已经分配的字节数
reserve 为数组预分配固定的元素数,可以在运行时刻进行修改
empty 判断数组中是否包含元素
erase 从数组中删除某个元素
clear 清楚数组中所有元素
max_size 返回数组所允许的最大尺寸,通常是指系统中用于分配的最大可用内存总数
swap 允许两个数组快速而高效地交换数据
resize 为数组重新确定新的大小,可以使用一个可选参数初始化新值
下面向大家介绍如何利用上述方对不定长数组进行操作:

1、不定长数组的构造

vector <int> newItems1

vector <int,allocator >int> > nItems2

//上述两句代码功能相同,声明一个整数类型的不定长数组,该数组的元素个数为0。
vector <int> nItems3(10,1);//构造一个10个元素的数组,数组的每个元素为1
vector <int> nItems4(nItems3)

vector <int> nItems5(nItems3.begin(),nItems3.end())

//上述两句代码将数组nItems3的内容拷贝到新的不定长数组nItems4和nItems5中
int d1[10]={0,1,2,3,4,5,6,7,8,9}

vector <int> v1(d1,d1+10)

//将数组d1/的所有元素拷贝到不定长数组v1中

2、数组中元素的操作

if(!nItems3.empty())//判断不定长数组nItems3是否包含数据
int first=nItems3[0];//获取数组中的第一个元素
if(nItems4.size()>=2)//判断数组中的元素个数是否大于等于2
nItems4[1]=100;//将数组中的第2个元素赋值

3、元素查找

vector <int> iterator where=find(v1.begin(),v1.end(),35);//在数组中查找35
if(*where!=35)
ShowMessage(&quot;数组中没有这个数&quot;)


4、元素的添加和删除

nItems1.insert(nItems1.begin(),10);//在数组的头部插入一个元素10
nItems1.insert(nItems1.end(),20);//在数组的尾部插入一个元素20
vector <int>::iterator where=find(v1.begin(),v1.end(),4)
if(*where==4)
v1.insert(where,8)

nItems4.insert(nItems4.end(),v1.begin(),v1.end());//将数组v1的全部元素插入到数组nItems4的尾部
nItem3.erase(nItems3.begin());//删除数组的第一个元素
nItem3.erase(nItems3.end());//删除数组的最后一个元素
nItem3.erase(nItems3.begin(),nItems3.end());//删除数组的所有元素,相当于nItems3.clear()

vector <int>::iterator where=find(v1.begin(),v1.end(),4)
if(*where==4)
v1.erase(where)

//在数组中寻找元素4,找到则删除它

注意:一定要在程序中加入#include<vector.h>这一句代码。

由此可见,vector类中的众多方法解决了不定长数组中元素的插入删除等工作,我们不需要编程实现上述操作带来的元素移动等问题。是不是很简便啊?
 
哥们,我说的是Delphi.你给我弄别的语言的干什么!
这个问题哦很急!请大家快点帮帮我!
 
人都跑到哪里去了!
 
对数组的查找用For循环即可。
对数组进行插入和删除很麻烦(涉及到空间分配、元素的整体移动),你可以用TList来做。
 
只能用世界上最笨的办法
如何查找数组!:用一个循环一个一个对比
如何插入数组!:把数组长度加长一位,插入点以后的所数据右移一位,然后空出来的地方插入数据
如何删除数组!:先删除所要删的数组,然后删除点以后的全部数据左移一位,然后把数组长度减少一位

另外强烈谴责weiliu的copy行为,虽然他很有钱
 
这应该是一个算法和数据结构的问题
使用Delphi的TList可以很好的完成
当然使用动态数组也可以
比如声明一个动态数组
var
tmpArray: array of Integer;
对数组进行赋值(Delphi中动态数组下标只能从0开始)
SetLength(tmpArray, 10);
for i := 0 to 9 do
tmpArray := i;
查找数组,如果建立数组的时候没有对他进行索引,那么我能想到的方法只有完全遍历.假设找出5在数组中的位置,不存在返回-1,使用变量tmpIndex标记
tmpIndex := -1;
for i := 0 to Length(tmpArray) - 1 do
if tmpArray = 5 then
begin
tmpIndex := i;
Break;
end;
删除数组的元素,比如删除第K个数字
for i := k to Length(tmpArray) - 1 do
tmpArray[k] := tmpArray[k + 1];
SetLength(tmpArray, Length(tmpArray) - 1);
增加数组的元素,比如在第K个位置增加一个元素
SetLength(tmpArray, Length(tmpArray) + 1);
for i := Length(tmpArray) - 2 downto k do
tmpArray[k + 1] := tmpArray[k];
tmpArray[k] := 5;

算法就是这样了:)
 
楼主 此技术在那里用啊?
 
谢各位了。不过我感觉技术含量还不够,希望大家给我顶顶此贴!
请各位高人,给我一个示例
 
查找数组
index := -1;
for i := low(readbuf) to high(readbuf)
if readbuf = $1A then
begin
index := i;
break;
end;

删除数组
procedure Del(a: array of Integer
Index: Integer);
var
i: Integer;
begin
for i:=Index to Length(a)-2 do
a:=a[i+1];
SetLength(a, Length(a)-1)
end;
增加数组。
procedure Add(a, b: array of Integer
var c: array of Integer);
begin
SetLength(c, Length(a)+Length(b));
Move(a[0], c[0], Length(a));
Move(b[0], c[Length(a)], Length(b))
end

普通添加
var
temp:array of integer;
kk:integer;
begin
setlength(temp,2);
temp[0]:=0;
temp[1]:=1;
setlength(temp,3);
temp[2]:=2;
for kk:=low(temp) to high(temp) do
begin
showmessage(inttostr(temp[kk]));
end;
 
谢各位了!
 
多人接受答案了。
 
后退
顶部