gpt4 book ai didi

Delphi TList 复制到另一个 TList 中?

转载 作者:行者123 更新时间:2023-12-01 22:37:44 28 4
gpt4 key购买 nike

我想知道是否有任何安全的方法可以将 TList 元素复制到任何其他 TList 中特定的位置和特定的长度。我应该将 list1 的元素分配给 list2 还是有没有我不知道的功能可以更准确地处理?

感谢您抽出宝贵时间。

最佳答案

如果您的目的是替换项目而不是将它们插入到给定位置,那么答案是没有直接的机制,而迭代分配是使用的方法。

for i := 1 to maxItems do
dest[ insertPos + i - 1] := src[ i - 1 ];

在这种情况下,您应该考虑添加的项目数量超出了目标列表的空间的情况。这是否意味着仅替换“适合”的尽可能多的项目、添加其他项目以“腾出空间”或根本不分配任何项目(除非所有项目都适合),这是一个只有您的要求才能回答的问题。

但是,如果您的目的是将项目插入到目标列表中,则可以结合使用InsertRange()Copy() 与源列表维护的 内部 数组一起。例如,使用 TList 的两个实例:

var
src, dest: TList<String>;
insertIndex, maxItems: Integer;

dest.InsertRange( insertIndex, Copy( src.List, 0, maxItems ) );

要插入整个src列表,您不需要使用Copy(),但可以直接在>InsertRange()方法:

dest.InsertRange( insertIndex, src );

性能说明:

如果源列表很大和/或添加的子项数量很小,则使用Copy()可能是一个昂贵的操作。但是,将项目实际插入到目标列表中的效率非常高,因为 InsertRange() 方法能够通过单个操作为目标列表中的新项目腾出空间,然后插入新项目为它们创建的空间中的项目,因此对于添加大量项目来说,它仍然可能被证明是最有效的。

另一种方法是单独迭代地插入源项:

for i := 1 to maxItems do
dest.Insert( insertIndex, src[i - 1]);

虽然这避免了复制插入的数组项目,但如果目标列表很大并且插入的项目数量较多,则迭代插入本身可能效率低下,因为必须为目标列表中的每个项目单独腾出空间插入(尽管通过显式计算和预分配目标列表的容量可以显着改善其潜在影响)。

例如如果您要将 1000 个项目列表中的 100 个项目插入到 2000 个项目列表的(精确)中间:

InsertRange( Copy() )       Copy 100 items into an intermediate array
Moves 1000 items in the dest list to make room for 2100 (total)
Inserts 100 items into the 'blank' space

Iterative insert 100 repetitions of:
Move 1000 items in the dest list to make room for 1 more
Inserts 1 item

对于插入 100 个项目,InsertRange() 可能是最有效的。相比之下,如果仅从源列表中插入单个项目,则 InsertRange() 方法可能会产生过多的开销。

正如我认为显而易见的那样,不同的起始条件将决定这两种方法中哪一种最有效,如果性能是一个重要问题,则应该考虑这一点。

关于Delphi TList<T> 复制到另一个 TList 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26721955/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com