本页面记录了 Tesseract OCR 代码库中使用的列表数据结构。Tesseract 实现三种主要的列表结构,用于高效地表示和操作数据元素的集合。这些列表结构是许多内部数据表示的基础,从 OCR 处理过程中存储块和单词,到管理参数列表和搜索结果。
Tesseract实现了三种主要的链表类型,每种类型都有不同的特性
来源: src/ccutil/clst.h36-996 src/ccutil/elst.h76-86 src/ccutil/elst2.h54-64
列表结构被实现为泛型模板类,并使用宏来创建特定类型的列表类
CLISTIZEH(T) 宏生成,创建一个 T_CLIST 类ELISTIZEH(T) 宏生成,创建一个 T_LIST 类ELIST2IZEH(T) 宏生成,创建一个 T_LIST 类每种列表类型都有相应的迭代器类型用于遍历列表
T_C_IT)来源: src/ccutil/clst.h991-995 src/ccutil/elst.h760-772 src/ccutil/elst2.h996-1005
三种列表类型在内存架构上存在显著差异
CLIST (ConsList):
ELIST (IntrusiveForwardList):
ELIST<T>::LINKELIST2 (IntrusiveList):
ELIST2<T>::LINK来源: src/ccutil/clst.h37-62 src/ccutil/elst.h89-111 src/ccutil/elst2.h67-87
所有三种列表类型都提供了用于遍历和操作列表的迭代器。这里是一个遍历列表的常见模式
该模式在代码库中被广泛用于处理列表中的元素。
来源: src/ccstruct/werd.cpp70-105 src/ccutil/clst.h695-756 src/ccutil/elst2.h567-607
所有列表类型都支持通用操作,但实现方式略有不同
来源: src/ccutil/clst.h426-487 src/ccutil/elst.h528-562 src/ccutil/elst2.h568-608
CLIST 结构 (ConsList) 提供了一些其他列表类型所没有的附加功能
来源: src/ccutil/clst.h891-917 src/ccutil/clst.h927-960 src/ccutil/clst.h967-988
ELIST2 结构 (IntrusiveList) 提供双向遍历功能
列表结构在 Tesseract 代码库中被广泛使用
CLIST 通常用于数据对象并非专门为列表包含而设计的集合
来源: src/ccstruct/blobbox.h141 src/textord/tabvector.h58
ELIST 用于更轻量级的列表,只需要前向遍历
来源:src/ccutil/ambigs.h134 src/ccmain/paramsd.h47
ELIST2 用于需要双向遍历的最重要结构
来源:src/ccstruct/werd.h199 src/textord/colpartition.h56
所有列表类型都实现为循环列表,其中最后一个元素指向第一个元素。此设计允许
列表结构以不同的方式处理内存管理
大多数列表提供以下方法
来源:src/ccutil/clst.h824-836 src/ccutil/clst.h800-811
所有列表类型都提供了在迭代期间删除元素的强大机制
来源:src/ccstruct/werd.cpp217-220 src/colpartition.cpp217-224
选择合适的列表类型:
迭代器生命周期:
内存管理:
来源:unittest/list_test.cc50-79 unittest/list_test.cc81-105 unittest/list_test.cc107-149
Tesseract 的列表结构提供了高效的链表实现,针对不同的用例进行了优化。理解这些结构对于使用 Tesseract 代码库至关重要,因为它们构成了系统中大多数数据集合的基础。