(三)CvSeq数据结构

源代码定义

#define CV_TREE_NODE_FIELDS(node_type)                               /
    int       flags;             /* Miscellaneous flags.     */      /
    int       header_size;       /* Size of sequence header. */      /
    struct    node_type* h_prev; /* Previous sequence.       */      /
    struct    node_type* h_next; /* Next sequence.           */      /
    struct    node_type* v_prev; /* 2nd previous sequence.   */      /
    struct    node_type* v_next  /* 2nd next sequence.       */

/*
   Read/Write sequence.
   Elements can be dynamically inserted to or deleted from the sequence.
*/
#define CV_SEQUENCE_FIELDS()                                              /
    CV_TREE_NODE_FIELDS(CvSeq);                                           /
    int       total;          /* Total number of elements.            */  /
    int       elem_size;      /* Size of sequence element in bytes.   */  /
    schar*    block_max;      /* Maximal bound of the last block.     */  /
    schar*    ptr;            /* Current write pointer.               */  /
    int       delta_elems;    /* Grow seq this many at a time.        */  /
    CvMemStorage* storage;    /* Where the seq is stored.             */  /
    CvSeqBlock* free_blocks;  /* Free blocks list.                    */  /
    CvSeqBlock* first;        /* Pointer to the first sequence block. */

typedef struct CvSeq
{
    CV_SEQUENCE_FIELDS()
}
CvSeq;

 

还有一个结构序列块

typedef struct CvSeqBlock
{
    struct CvSeqBlock*  prev; /* Previous sequence block.                   */
    struct CvSeqBlock*  next; /* Next sequence block.                       */
  int    start_index;         /* Index of the first element in the block +  */
                              /* sequence->first->start_index.              */
    int    count;             /* Number of elements in the block.           */
    schar* data;              /* Pointer to the first element of the block. */
}
CvSeqBlock;

 

就我的理解是

一个序列里面有许多序列块,而每个序列块里面存储着多个元素。多个序列之间可以通过

宏CV_TREE_NODE_FIELDS(CvSeq)进行联系,进而形成各种数据结构。序列中的

多个序列块也是通过序列块中的prev,next指针连接起来形成双向链表。

 

序列的创建需要从动态存储器中申请分配空间,元素的增加插入等操作也需要向存储器申请空间。

 

比较难以理解的结构中变量

 schar*    block_max;最后一个序列块中已经分配空间的最远地址边界,主要用于与下一个指针进行比较,判断未用空间是否满足元素增加的分配。

 schar*    ptr;指示当前元素存储位置,依次存储增加的新元素,在地址空间[ptr,block_max)中可以用于存储新元素。

 int       delta_elems; 当[ptr,block_max)地址空间不够存储新元素时,重新向存储器申请的空间大小。

 CvSeqBlock* free_blocks;空的序列块列表

 

int start_index; 每个块中的第一个元素在整个序列元素中的索引。一般第一块第一个元素为0,插入删除操作后会变化。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值