Delphi中是否存在类似C++ std::set的有序集合类型?
Delphi 有序整数集合类实现方案
Delphi 内置的set类型属于位集结构,语法层面限定仅支持取值范围不超过0~255的序数类型,因此你声明set of Integer时会触发元素上限的编译错误,这是内置集合类型的固有约束,无法调整。
针对有序整数存储、快速存在性检索的需求,可采用以下官方原生方案:
1. 优先使用泛型 TOrderedSet<T> 类
Delphi XE 及以上版本自带的System.Generics.Collections单元提供了泛型有序集合TOrderedSet<T>,实现逻辑和C++的std::set完全一致,底层采用红黑树结构:
- 元素自动按升序(可自定义排序规则)存储
- 插入、删除、存在性检查的时间复杂度均为O(log n)
- 无256元素上限限制,支持整数等任意可比较类型
使用示例如下:
uses System.Generics.Collections; procedure TestIntSet; var IntSet: TOrderedSet<Integer>; begin IntSet := TOrderedSet<Integer>.Create; try // 插入整数元素 IntSet.Add(12); IntSet.Add(3); IntSet.Add(45); // 快速检索元素是否存在 if IntSet.Contains(3) then Writeln('元素3存在'); // 遍历会按从小到大的顺序输出:3、12、45 for var Num in IntSet do Writeln(Num); finally IntSet.Free; end; end;
2. 低版本Delphi兼容方案
如果你使用的是XE之前无泛型支持的Delphi版本,可以选择以下两种替代方案:
- 整数取值范围可控时,使用
TBits类,通过下标判断元素是否存在,检索效率为O(1) - 整数范围较大时,使用
TList存储整数,插入时手动维护有序性,查找时调用BinarySearch二分查找接口,检索效率为O(log n)
内容的提问来源于stack exchange,提问作者Bruice
相关产品推荐
相关产品推荐

