CGAL的手柄和循环器

1、手柄

        CGAL中的大多数数据结构在其用户界面中使用Handles 的概念来引用它们存储的元素。这个概念描述了有时被称为琐碎迭代器的东西。Handle类似于指向对象的指针,提供解引用运算符*()和成员访问运算符->(),但没有像迭代器那样的递增或递减运算符。只要引用的对象不是逻辑序列的一部分,就可以使用句柄。

        句柄的模型简单指针T*、值类型为T的迭代器或循环器也是句柄。

2、范围

        CGAL中的大多数数据结构都使用迭代器范围的概念。Range和ConstRange概念封装了对迭代器范围的第一个和最后一个迭代器的访问。STL容器是Range的模型。The Boost。范围库也围绕这个概念提供了很好的支持。

3、循环器

        介绍了循环器的概念。给出了几个在迭代器和循环器之间进行转换的适配器。以下是循环器的一些有用函数。本章最后对所做的设计决策进行了讨论。有关循环器要求、提供的基类、循环器标签以及对迭代器和循环器通用算法的支持的完整描述,请参阅参考页。请注意,循环器不是STL的一部分,而是CGAL的一部分。

3.1、介绍、

        STL中迭代器的概念是为线性序列量身定制的。相反,圆形序列自然地出现在许多组合和几何结构中。例如多面体曲面和平面图,其中从顶点发出的边或小平面周围的边形成圆形序列。

        由于循环序列不允许有效的迭代器,我们引入了循环器的新概念。它们共享迭代器的大部分要求,而主要的区别是序列中没有超过末尾的位置。在迭代器和循环器之间提供了适当的适配器,以将循环器平滑地集成到STL的框架中。一个泛型包含函数的例子说明了循环器的使用。与圆形结构的通常情况一样,do-while循环是优选的,使得对于特定输入c==d,到达序列中的所有元素。

template <class Circulator, class T>
bool contains( Circulator c, Circulator d, const T& value) {if (c != 0) {do {if (*c == value)return true;} while (++c != d);}return false;
}

        定义了三类循环器:前向、双向和随机接入循环器。给定一个循环器c,运算*c表示循环器所指的项。运算++c使循环器前进一项,-c使双向循环器后退一项。对于随机接入循环器,c+n使循环器前进n步。可以比较两个循环器是否相等。

        循环器与迭代器在可达性和范围方面有不同的概念。循环器d称为从循环器c可达,如果c可以在算子++的有限多个应用中等于d。由于序列的循环性,如果两个循环器都引用相同序列的项,则这总是正确的。特别地,c总是从c可达的。给定两个循环器c和d,范围[c,d)表示通过从c开始并推进c直到达到d而获得的所有循环器,但不包括d,对于d!=c。到目前为止,它与迭代器的范围定义相同。区别在于使用[c,c)表示循环序列中的所有项,而对于迭代器i,range[i,i)表示空范围[c,d)的行为类似于迭代器范围,可以在STL算法中使用。但是,对于循环器,需要一个额外的测试c==nullptr,当且仅当循环序列为空时,该测试返回true。对于c++,我们建议使用0而不是nullptr。

        除了概念上的简洁,发明一个与迭代器意图相似的新概念的主要原因是效率。迭代器应该是一个轻量级对象——仅仅是一个指针和一个用于推进迭代器的间接方法。尽管迭代器可以为循环序列编写,但我们不知道有什么有效的解决方案。循环序列中的遗漏超过结束的情况可以用循环顺序中的任意哨兵来解决,但这会破坏结构中的自然对称性(这本身就是个坏主意),并且项目中的额外记账和迭代器高级方法中的检查会降低效率。另一种解决方案可能在迭代器中使用更多的记账,例如,使用一个开始项、一个当前项和一种绕组数,该绕组数对于begin()-迭代器为零,对于过去-结束情况为一[1]。我们引入了允许轻量级实现的循环器的概念,CGAL支持库提供了在迭代器和循环器之间转换的适配器类(在效率上有相应的惩罚),以便将这一新概念集成到STL的框架中。

        一个严重的设计问题是与迭代器范围相比,循环器范围的语义略有变化。由于这个语义是由直观运算符++和==定义的,我们也希望为循环器保留这些运算符,因此循环器范围可以用于STL算法。这本身就是一个有用的特征,如果没有完整范围[c,c)的定义,STL算法会将其视为空范围。然而,错误的可能性可能被高估了,因为对于支持循环器的容器c来说,没有end()成员函数和std::sort(c.begin(),c.end())等表达式)将失败。

        在编译时很容易区分迭代器和循环器,这允许通用算法同时支持这两个参数。也可以使用相同的技术保护算法不受不适当参数的影响,请参阅循环器的参考页,特别是Assert_iterator()和is_empty_range()函数。 

        注意
        请注意,范围的定义与迭代器的定义不同。数据结构的接口必须声明它是使用迭代器、循环器,还是同时使用这两种方法。STL算法总是在它们的接口中只指定迭代器。迭代器接口中使用的循环器的范围[c,d)将在c!=d的时间内按预期工作。范围[c,c)将被解释为与迭代器类似的空范围,这与它应该表示的循环器全范围不同。

3.2、迭代器和循环器之间的适配器

        在迭代器范围上工作的算法不能完全通用地应用于循环器范围,只能应用于上一节中指出的子范围。以下适配器将循环器转换为迭代器,反之亦然(具有不可避免的空间和时间损失),以重新建立这种通用性。

        Container_from_circulator是一个类似容器的类,具有从循环器构建的迭代器

        Circulator_from_iterator是一个在两个迭代器范围内的循环器

        Circulator_from_container是容器的循环器

        以下示例将STL的通用std::reverse()算法应用于双向循环器c给出的序列。它使用Container_from_circulator适配器。

Circulator c; // c must be at least bidirectional.
CGAL::Container_from_circulator<Circulator> container(c);
std::reverse( container.begin(), container.end());

        另一个例子为int的向量定义了循环器c。然而,由于矢量中没有元素,循环器表示一个空序列。如果矢量中有元素,循环器将实现序列大小的随机访问模。 

std::vector<int> v;
typedef CGAL::Circulator_from_iterator< std::vector<int>::iterator > Circulator;
Circulator c( v.begin(), v.end());

3.3、循环器上的函数

        几个函数处理循环器和循环器范围。类型C表示循环器。类型IC表示循环器或迭代器。

C c, d;
IC ic1, ic2;
circulator_size(c);          // size of the sequence reachable by c
circulator_distance(c, d);   // number of elements in the range [c, d)
iterator_distance(ic1, ic2); // number of elements in the range [ic2, ic1)
is_empty_range(ic1, ic2);    // test the range [ic2, ic1) for emptiness

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java代码审计】目录穿越篇

【Java代码审计】目录穿越篇 1.Java中的目录穿越2.目录穿越漏洞审计3.Java中目录穿越漏洞修复 1.Java中的目录穿越 目录穿越漏洞产生的本质是路径可控&#xff0c;一旦涉及文件的读取问题便会涉及java.io.File类&#xff0c;因此在审计这类漏洞时可以优先查找java.io.File引用…

最强Pose模型RTMO开源 | 基于YOLO架构再设计,9MB+9ms性能完爆YOLO-Pose

实时多人在图像中的姿态估计面临着在速度和精度之间实现平衡的重大挑战。尽管两阶段的上下文方法在图像中人数增加时会减慢速度&#xff0c;但现有的单阶段方法往往无法同时实现高精度和实时性能。 本文介绍了RTMO&#xff0c;这是一个单阶段姿态估计框架&#xff0c;通过在YOL…

超文本传送协议HTTP

目录 HTTP简介&#xff1a; URL的格式&#xff1a; HTTP协议的特点&#xff1a; HTTP/1.0协议&#xff1a; HTTP/1.1协议&#xff1a; HTTP/2: HTTP代理服务器&#xff1a; HTTP的报文结构&#xff1a; 请求报文的特点&#xff1a; 响应报文的特点&#xff1a; Cook…

小 cookie,大作用:探索网站中的隐私追踪器(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

大华 DSS 数字监控系统 itcBulletin SQL 注入漏洞复现

0x01 产品简介 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。 0x02 漏洞概述 大华 DSS存在SQL注入漏洞,攻击者 /portal/services/itcBulletin 路由发送特殊构造的数据包,利用报错注入获取数据库…

springboot——定时任务、异步任务

springboot——定时任务、异步任务 一、定时任务1、创建一个定时任务、时间配置文件2、springboot主程序开启定时任务 EnableScheduling3、使用 Scheduled 注解 二、定时任务、异步执行。1、springboot主程序开启异步任务 EnableAsync2、方法上增加 Async 注解&#xff0c;标识…

【JAVA日志框架】JUL,JDK原生日志框架详解。

前言 Java日志体系混乱&#xff1f;Java日志框架系列&#xff0c;清晰简洁整理好整个Java的日志框架体系。第一篇&#xff0c;JDK原生日志框架——JUL。 目录 1.概述 2.日志级别 3.配置 4.继承关系 1.概述 日志框架的核心问题&#xff1a; 日志是用来记录应用的一些运行…

.NET基础面试题一

1.C#中堆和栈的区别? 堆(Heap)和栈(Stack)是C#中两种分配内存的不同方式 栈(Stack)&#xff1a;是一种先进后出的内存分配方式。它用于存储基本数据类型和对象引用&#xff0c;它是一种连续的内存空间&#xff0c;存储在cpu的寄存器上&#xff0c;它的大小在编译的时就是已知的…

nodejs+vue+微信小程序+python+PHP校园二手交易系统的设计与实现-计算机毕业设计推荐

(2)管理员 进行维护&#xff0c;以及平台的后台管理工作都依靠管理员&#xff0c;其可以对信息进行管理。需具备功能有&#xff1b;首页、个人中心、学生管理、物品分类管理、物品信息管理、心愿贴、系统管理、订单管理等功能。系统分成管理员控制模块和学生模块。 本系统有良好…

pyansys环境配置(安装所需的库)

目录 1. 环境配置&#xff1a; 2. pyansys库配合Ansys软件启动代码 1. 环境配置&#xff1a; 试了好多种版本&#xff0c;最终以下版本可以跑通&#xff1a; 注意&#xff1a;Python和ANSYS的版本也会影响到安装包的版本&#xff0c;我使用的配置如下&#xff1a; Python3.9…

maven+spock

pom配置 话说JunitMockito的组合用起来是真难用&#xff0c;还是Spock的简单&#xff0c;尤其是参数化的测试。junit的Parameter是鸡肋&#xff0c;杂恶心&#xff1b;Theories用来也不爽。 <?xml version"1.0" encoding"UTF-8"?><project xm…

linux ioctl

ioctl 接口介绍 大部分驱动需要 -- 除了读写设备的能力 -- 通过设备驱动进行各种硬件控制的能力. 大 部分设备可进行超出简单的数据传输之外的操作; 用户空间必须常常能够请求, 例如, 设 备锁上它的门, 弹出它的介质, 报告错误信息, 改变波特率, 或者自我销毁. 这些操作常 常通…

【大数据】Doris 的集群规划和环境准备

Doris 的集群规划和环境准备 1.1 环境要求1.1 Linux 操作系统版本需求1.2 软件需求 1.2 硬件要求1.3 节点规划1.4 通信端口1.5 IP 地址绑定 Doris 作为一款开源的 MPP 架构 OLAP 数据库&#xff0c;能够运行在绝大多数主流的商用服务器上。为了能够充分运用 MPP 架构的并发优势…

Spring容器中scope为prototype类型Bean的回收机制

文章目录 一、背景二、AutowireCapableBeanFactory 方法 autowireBean 分析三、Spring 容器中 scope 为 prototype 类型 Bean 的回收机制四、总结 一、背景 最近做 DDD 实践时&#xff0c;遇到业务对象需要交给 Spring 管理才能做一些职责内事情。假设账号注册邮箱应用层代码流…

Flask学习三:模型操作

ORM flask 通过Model操作数据库&#xff0c;不管你的数据库是MySQL还是Sqlite&#xff0c;flask自动帮你生成相应数据库类型的sql语句&#xff0c;所以不需要关注sql语句和类型&#xff0c;对数据的操作flask帮我们自动完成&#xff0c;只需要会写Model就可以了 flask使用对象关…

第十五章总结

一.输入/输出流 1.输入流 InputStrema类是字节输入流的抽象类&#xff0c;它是所有字节输入流的父类。 该类中所有方法遇到错误都会引发IOException异常。 read()方法&#xff1a;从输入流中读取数据的下一个字节。返回0~255的int字节值。如果因为已经到达流末尾而没有可用的…

vue3通过provide与inject我们可以把父组件数据传递N个层级的子组件

vue3 provide 与 inject 我们通过props属性可以把数据传给组件&#xff0c;而通过provide与inject我们可以把数据传递给N个层级的子组件&#xff0c;比如A组件用了B组件&#xff0c;B组件用了C组件&#xff0c;它可以把组件直接从A传给C组件,vue2使用computed来实现响应式,而v…

【模块化】 js 模块化(CommonJS, AMD, UMD, CMD, ES6)

目录 js 的演变模块化1. CommonJS 规范commonJs伪代码⭐CommonJS优缺点 2. AMD 规范⭐AMD 优缺点 3. UMD 规范⭐UMD AMD CommonJS 4. CMD 规范⭐CMD 优缺点 5. ES6 模块化符号绑定⭐ESM 优缺点 AMD 和 CMD 的区别ES6 模块与 CommonJS 模块的差异参考 将介绍几种 js 模块化的规…

新能源汽车的“一池春水”,或许不再由价格战掀起波澜?

2005年12月15日&#xff0c;丰田普锐斯混合动力车进入中国&#xff0c;拉开了国内新能源汽车发展的序幕。18年后的今天&#xff0c;国产及进口的新能源汽车已经渗透我国超三分之一的乘用车市场&#xff0c;与油车二分天下的愿景渐趋实现。 今年11月&#xff0c;随着购车需求进…

npm install老是卡住是什么问题

最简单的vue项目我install的时候都出现了问题,给我苦恼的,经过我的仔细对比发现: 从网上搜索的这个镜像源是存在问题的,很多资源是下载不了的,没有深究为什么,就这个淘宝的: npm config set registry https://registry.npm.taobao.org/ 换成下面的这个国内镜像源就好了 n…