本来参考了一个文章 可惜测试报错 
http://hi.baidu.com/blackcode/blog/item/4ec300f4b06f9ae77709d748.html哪种方法 效率高  速度快  不报错 呵呵 我对 move  不是很熟悉 有采用动态链表方法的 最好 

解决方案 »

  1.   

    d2009 开始有的 TDictionary<,> 是基于 hash 实现的,如果 key 冲突不高的话,查找和删除复杂度都是常数级别的,效率非常高。其它删除效率比较高的,可以考虑高度平衡的二叉树,如 avl tree、r-b tree 之类,插入、查找、删除的算法复杂度都是 O(log(N))。但这几种都是基于不重复的 key 的,不知道你的需求,而且空间占用也相对高一些。如果是用 key-value 的形式储存的,而且不特别经常需要有序输出的话,用 hash table 比较好一些;如果有序输出非常频繁,那可以考虑 avl tree 或 r-b tree。
    不用 key 的数据结构中,常用的有链表、数组和堆等。链表删除的算法复杂度是 O(N),但是查找和插入的复杂度也是 O(N),而且也有额外的空间占用。List(Array)的插入和删除复杂度都是 O(N^2),但是查找的复杂度是常数。堆的应用一般是优先队列之类,不知道你的需求也不好说怎么样。
      

  2.   


    实际应用中 需要 实际删除 元素 否则 统计 length 不是实际长度 
    所以添加 删除标记 不可取 有哪位可以 给 出 可行的 代码 ?
      

  3.   

    你可以定义一个结构(record)或者类(class)做一级管理,那样子什么Length一类的都可以交给它去处理。
      

  4.   


      TSubField = record //子字段
        Name: string; //子字段名
        Dsp: string; //子字段显示标题
        Data: string; //子字段数据
      end;
      TSubFields = array of TSubField;  TField = record //字段
        Name: string; //字段名
        ChineseName: string; //字段名中文名
        Dsp: string; //字段显示标题
        Data: string; //字段数据
        Indicator1: string; //指示符1
        Indicator2: string; //指示符2
        SubFields: TSubFields; //子字段数组
        SubFieldsCount: Integer; //子字段个数
      end;
      TFields = array of TField;......var FFields: TFields;现我想删除  FFields[5]  元素  如何操作? 删除 TSubFields[i]  如何写 涉及 结构体 嵌套了
      

  5.   

    下面是TList 的删除方法,改一下就行了:
    procedure TList.Delete(Index: Integer);
    var
      Temp: Pointer;
    begin
      if (Index < 0) or (Index >= FCount) then
        Error(@SListIndexError, Index);
      Temp := Items[Index];
      Dec(FCount);
      if Index < FCount then
        System.Move(FList^[Index + 1], FList^[Index],
          (FCount - Index) * SizeOf(Pointer));
      if Temp <> nil then
        Notify(Temp, lnDeleted);
    end;不过我觉得你还不如把你的数组改用TList,把你的结构体声明成指针就行了
      

  6.   

    To: wzwcn
    procedure TForm1.Button2Click(Sender: TObject);
    var
      I, arrIndex: Integer;
    begin
      arrIndex := StrToInt(Edit1.Text);
      Move(myRecord[arrIndex + 1], myRecord[arrIndex], (High(myRecord) - arrIndex) * sizeof(TmyRecord));
      SetLength(myRecord, Length(myRecord) - 1);end;
    参考了 你给的代码  我测试调试成功 不再报错了  呵呵  
      

  7.   

    这种 record 中有 string 的直接 Move 就等着内存泄露吧
      

  8.   


    害怕怕   僵哥出来说句话呀  
    也请楼上 讲讲理由  我的 结构体成员 有string 呀 
      

  9.   

    delphi的string,是编程方便的大功臣,也是程序不稳定的大。
      

  10.   

    -_- 简单安全点还是直接FOR一次好了。如果不是很大量数据移动,也不会慢到去哪,这样就不用为了那么一丁点的效率给自己增加那么多的技术风险了
      

  11.   

    把String改成ShortString就行了,比如指定一个长度。a:string[10];
      

  12.   

    如果 多个 是 结构体嵌套的  类型 该如何操作呢 ?见 9 楼 所述 ?
    是不是 先删除 子结构体 然后 再move 顶层 结构体 
      

  13.   

    经过测试 结构体嵌套类型 动态数组 包含有 string 类型  
    move  会异常  得不到 正确结果 安全考虑  我还是用 for  一遍 赋值 吧
      

  14.   

    直接Move应该是浅复制,如果结构体内有一些复杂数据类型(如string或动态数组,由RTL来控制)
    ,只把结构体内的指针复制过去了,而源对象的引用计数没有改变!因此可能会由于引用计数而导致对象的提前释放,而数组中那个指针还傻乎乎地指着刚刚已经被释放的堆内存,程序就挂了
      

  15.   

    经典,,俺用C++的STL的vector时就犯过这样的错误
      

  16.   

    move 其实也是遍历字节拷贝的