8.3.9 M4中的设置操作

有时,有必要跟踪一组数据,而订单没关系,在集合中哪里没有重复项。以下内容宏便于进行集合操作。每个集合都是一个不透明对象,只能通过这些基本操作访问。基础实现保证了集合创建的线性缩放比使用二次曲线更有效m4_附录_uniq。两组名称和值可以是任意字符串,但不平衡引号除外。此实现将被删除元素的内存占用到下一个必须遍历集合中所有元素的操作;尽管如此这可能会减慢某些操作,直到删除元素的内存经过修剪后,仍然可以保证线性性能。

宏:m4设置添加 (设置,价值,[如果-无],[if-dup(if-dup)])

添加字符串价值作为集合的成员设置.展开如果-无如果添加了元素,或if-dup(if-dup)如果是的话在集合中的前面。在摊销的恒定时间内运行,因此设置创建以线性方式缩放。

宏:m4_设置_添加_全部 (设置,价值…)

添加每个价值到集合设置。这稍微多一点比重复调用更有效率m4设置添加.

宏:m4集合容器 (设置,价值,[if-存在],[如果不存在])

展开if-当前如果字符串价值是的成员设置,否则如果不存在.

m4_set_contains([a],[1],[是],[否])m4_set_add([a],[1],[added],[dup])补充m4_set_add([a],[1],[added],[dup])复制m4_set_contains([a],[1],[是],[否])m4_set_remove([a],[1],[removed],[missing])已删除m4_set_contains([a],[1],[是],[否])m4_set_remove([a],[1],[removed],[missing])丢失的
宏:m4设置内容 (设置,[九月])
宏:m4设置泵 (设置,[9月])

展开为包含集合所有成员的单个字符串设置,每个由隔开九月,未展开。m4设置内容将元素留在设置但回收任何被删除元素占用的内存,而m4设置泵是一个更快的一次性动作也会删除集合。未制定准备金用于消除包含非空成员的歧义九月作为一个子串;使用m4_set_空区分空集和只包含空字符串的集合。输出的顺序未指定;在当前的实现中m4设置泵使用不同于m4设置内容。这些宏在在内存修剪之前设置,以及m4设置内容([设置],[九月])比…快m4_接合([九月]m4设置列表([设置])).

m4集合添加所有([a],[1],[2],[3])m4设置内容([a],[-])1-2-3m4_joinall([-]m4_set_listc([a]))1-2-3m4设置转储([a],[-])3-2-1m4设置内容([a])m4设置添加([a],[])m4_set_contents([a],[-])
宏:m4_设置_删除 (设置)

删除与关联的所有元素和内存设置。这是在设置大小上是线性的,并且比一次删除一个元素更快。

宏:m4设置差异 (刚毛,机顶盒)
宏:m4设置交叉段 (刚毛,机顶盒)
宏:m4设置联合 (刚毛,机顶盒)

计算两者之间的关系刚毛机顶盒,并输出结果是引用的参数列表,没有重复项,并且带有前导逗号。设置差异选择中的元素刚毛但是机顶盒,交集仅选择两个集中的元素,并且联合选择任一集中的元素。这些动作在集合大小的总和。前导逗号是区分在没有元素和作为唯一元素的空字符串之间。

m4集合添加所有([a],[1],[2],[3])m4集合添加所有([b],[3],[],[4])m4设置差异([a],[b])⇒,1,2m4设置差异([b],[a])⇒,,4m4集合交叉([a],[b])⇒,m4集合联合([a],[b])⇒,1,2,3,,4
宏:m4设置为空 (设置,[如果是空的],[if-元素])

展开如果是空的如果集合设置没有元素,否则扩大if-元素。此宏以恒定时间运行。使用此宏可以帮助消除输出的歧义m4设置内容m4设置列表.

宏:m4设置为每个 (设置,变量,行动)

对于集合中的每个元素设置,展开行动使用变量定义为set元素。行为是未指定,如果行动递归列出的内容设置(尽管可以列出其他集合),或者如果它修改了集合除了删除当前包含在变量。此宏比相应的m4_每个([变量],m4输入目录([m4引用]m4设置列表([设置])), [行动]),虽然m4设置映射可能会更快。

m4_set_add_all([a]m4_用于([i],[1],[5],[],[,i]))m4设置内容([a])12345m4设置为每个([a],[i],[m4_if(m4_eval(i&1),[0],[m4_set_remove([a],i,[i])])24m4设置内容([a])135
宏:m4设置列表 (设置)
宏:m4设置列表 (设置)

生成参数列表,其中每个参数都是带引号的元素从集合中设置.变体m4设置列表是明确的,如果有集合元素,则添加前导逗号,而变体m4设置列表无法区分空集和只包含空字符串的集合。这些可以直接用于接受多个参数的宏,例如m4_加入m4_设置_添加_全部,或由包装m4_报价对于宏以引用的列表为例,例如m4地图m4_到达.任何删除的元素所占用的内存将在这些宏中回收。

m4集合添加所有([a],[1],[2],[3])m4集合列表([a])1,2,3m4集合列表([b])m4设置列表([b])m4计数(m4集合列表([b]))1m4设置为空([b],[0],[m4计数(m4设置列表([b]])])0m4设置添加([b],[])m4集合列表([b])m4设置列表([b])⇒,m4计数(m4集合列表([b]))1m4设置为空([b],[0],[m4计数(m4设置列表([b]])])1
宏:m4设置映射 (设置,行动)

对于集合中的每个元素设置,展开行动和一个单身set元素的参数。行为未指定,如果行动递归列出的内容设置(尽管列出了其他集合可以接受),或者如果它以除删除之外的任何方式修改集合作为参数传递的元素。这个宏比任何一个都快对应的副本m4映射参数([行动]m4_列表([设置]))m4设置为每个([设置],[var],[行动(m4_defn([var]))。可以使用m4_货币如果需要多个参数行动,尽管它是使用效率更高m4_set_映射_sep在这种情况下。

宏:m4设置映射步骤 (设置,[之前],[邮递],[九月])

对于集合中的每个元素设置,展开之前[元素]邮递,额外膨胀九月元素之间。如果递归展开,则未指定行为列出的内容设置(尽管列出了其他集合可以接受),或者如果它以除删除之外的任何方式修改集合扩展访问的元素。此宏提供了非破坏性地访问集合元素的有效方法;在里面特别是,m4设置映射([设置], [行动])是等效的m4设置映射步骤([设置], [行动(], [)]).

宏:m4_设置_删除 (设置,价值,[if-存在],[如果不存在])

如果价值是集合中的元素设置,然后将其拆下并扩大if-当前。否则展开如果不存在.此宏以恒定时间运行,因此多次清除将线性缩放而不是平方;但在室外使用时m4设置为每个m4设置映射,它会占用内存直到布景稍后由压实m4设置内容m4_set_列表.几个在元素的时间间隔内,其他集合操作的效率较低删除和随后的内存压缩,但仍保持其保证缩放性能。

宏:m4设置大小 (设置)

扩展到集合的大小设置。此实施操作在恒定时间内,因此比m4_eval(m4_count(m4_set_listc([集合]))-1).