LGenerics:现代 Pascal 的高性能泛型容器库
项目概述
LGenerics 是一个专为现代 Pascal(Free Pascal 和 Delphi)开发的高性能泛型容器库,由开发者 avk959 创建并维护。该项目旨在为 Pascal 开发者提供一套功能丰富、类型安全且性能优异的泛型数据结构和算法实现,填补了 Pascal 生态系统中高质量泛型库的空白。
核心特性
1. 全面的容器类型
LGenerics 提供了丰富的容器类型,包括: - 序列容器:动态数组、链表、栈、队列 - 关联容器:哈希表、有序映射、多重映射 - 树结构:红黑树、AVL树、B树 - 特殊容器:优先队列、双端队列、位集合
2. 高性能算法实现
库中包含了大量优化的算法: - 排序算法(快速排序、归并排序、堆排序) - 搜索算法(二分查找、插值查找) - 图算法(最短路径、最小生成树) - 字符串处理算法
3. 现代 Pascal 特性支持
完整的泛型支持
迭代器模式
Lambda 表达式支持
内存管理优化
安装与配置
Free Pascal 安装
# 克隆项目 git clone https://github.com/avk959/LGenerics.git # 添加路径到编译器搜索路径 fpc -Fu/path/to/LGenerics/src your_program.pas
Delphi 安装
下载项目源码
将
src目录添加到项目搜索路径在需要使用的单元中添加引用
使用示例
示例 1:基本容器使用
program LGenericsDemo;
{$mode objfpc}{$H+}
uses
SysUtils, lgVector, lgHashMap;
type
TStrVector = specialize TGLiteVector<string>;
TIntStrMap = specialize TGLiteHashMap<string, Integer>;
var
Names: TStrVector;
AgeMap: TIntStrMap;
i: Integer;
Pair: TIntStrMap.TEntry;
begin
// 使用动态数组
Names.Add('Alice');
Names.Add('Bob');
Names.Add('Charlie');
WriteLn('Names in vector:');
for i := 0 to Names.Count - 1 do
WriteLn(Names[i]);
// 使用哈希映射
AgeMap.Add('Alice', 25);
AgeMap.Add('Bob', 30);
AgeMap.Add('Charlie', 35);
WriteLn(#10'Ages:');
for Pair in AgeMap.Entries do
WriteLn(Pair.Key + ': ' + IntToStr(Pair.Value));
end.示例 2:算法应用
program AlgorithmsDemo;
uses
SysUtils, lgArrayHelpers, lgUtils;
type
TIntArray = specialize TGArray<Integer>;
TIntHelper = specialize TGComparableArrayHelper<Integer>;
var
Arr: TIntArray;
i, SearchResult: Integer;
begin
// 初始化数组
Arr := TIntArray.Create(5, 2, 8, 1, 9, 3);
WriteLn('Original array:');
for i := 0 to High(Arr) do
Write(Arr[i], ' ');
WriteLn;
// 排序
TIntHelper.Sort(Arr);
WriteLn('Sorted array:');
for i := 0 to High(Arr) do
Write(Arr[i], ' ');
WriteLn;
// 二分查找
if TIntHelper.BinarySearch(Arr, 8, SearchResult) then
WriteLn('Found 8 at index: ', SearchResult)
else
WriteLn('8 not found');
end.示例 3:自定义类型容器
program CustomTypeDemo;
{$mode objfpc}{$H+}
uses
SysUtils, lgAvlTree;
type
TPerson = record
Name: string;
Age: Integer;
constructor Create(AName: string; AAge: Integer);
end;
TPersonComparer = class
class function Less(const L, R: TPerson): Boolean; static;
end;
TPersonSet = specialize TGLiteAvlTreeSet<TPerson, TPersonComparer>;
constructor TPerson.Create(AName: string; AAge: Integer);
begin
Name := AName;
Age := AAge;
end;
class function TPersonComparer.Less(const L, R: TPerson): Boolean;
begin
Result := L.Name < R.Name;
end;
var
People: TPersonSet;
Person: TPerson;
begin
People.Add(TPerson.Create('Alice', 25));
People.Add(TPerson.Create('Bob', 30));
People.Add(TPerson.Create('Charlie', 35));
WriteLn('People in set (sorted by name):');
for Person in People do
WriteLn(Person.Name + ', Age: ' + IntToStr(Person.Age));
end.性能优势
LGenerics 在性能方面表现出色,主要得益于:
零开销抽象:通过模板和泛型实现,避免运行时类型检查
缓存友好设计:数据布局优化,提高缓存命中率
算法优化:使用现代算法实现,针对 Pascal 编译器优化
内存效率:精细的内存管理和分配策略
与其他 Pascal 库的比较
| 特性 | LGenerics | Generics.Collections | FGL |
|---|---|---|---|
| 容器种类 | 丰富 | 基本 | 有限 |
| 算法支持 | 全面 | 有限 | 无 |
| 性能优化 | 优秀 | 良好 | 一般 |
| 现代特性 | 完整支持 | 部分支持 | 不支持 |
| 活跃维护 | 是 | 是 | 否 |
最佳实践
选择合适的容器:根据使用场景选择最合适的容器类型
使用迭代器:优先使用迭代器进行遍历操作
预分配内存:对于已知大小的容器,预先分配内存以提高性能
利用算法:使用库提供的算法而非手动实现
社区与贡献
LGenerics 是一个活跃的开源项目,欢迎社区贡献: - 报告问题和 bug - 提交功能请求 - 贡献代码改进 - 编写文档和示例
总结
LGenerics 为 Pascal 开发者提供了一个强大、高效且易于使用的泛型容器库,极大地提升了 Pascal 在现代软件开发中的竞争力。无论是简单的数据存储需求,还是复杂的算法实现,LGenerics 都能提供优秀的解决方案。对于任何使用 Free Pascal 或 Delphi 进行开发的程序员来说,LGenerics 都是一个值得学习和使用的宝贵工具。
通过采用 LGenerics,Pascal 开发者可以编写出更简洁、更高效、更易维护的代码,同时享受到现代编程语言中常见的泛型编程范式带来的好处。




还没有评论,来说两句吧...