[CMake教程] CMake列表 - list

这篇具有很好参考价值的文章主要介绍了[CMake教程] CMake列表 - list。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

零、简介

列表在CMake中大量使用。初始化列表语法如下:

set(myList a b c) 	# Creates the list "a;b;c"

归根结底,列表只是一个由分号分隔列表项的单个字符串,这使得操作单个列表项变得不太方便。CMake提供了list()命令来简化这类任务,他的基本语法如下:

list(<command> <list> [<other_args>])

其中,<command> 是处理列表的命令,每个命令有各自的<other_args>,具体如下:

Reading
  list(LENGTH <list> <out-var>)
  list(GET <list> <element index> [<index> ...] <out-var>)
  list(JOIN <list> <glue> <out-var>)
  list(SUBLIST <list> <begin> <length> <out-var>)

Search
  list(FIND <list> <value> <out-var>)

Modification
  list(APPEND <list> [<element>...])
  list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>)
  list(INSERT <list> <index> [<element>...])
  list(POP_BACK <list> [<out-var>...])
  list(POP_FRONT <list> [<out-var>...])
  list(PREPEND <list> [<element>...])
  list(REMOVE_ITEM <list> <value>...)
  list(REMOVE_AT <list> <index>...)
  list(REMOVE_DUPLICATES <list>)
  list(TRANSFORM <list> <ACTION> [...])

Ordering
  list(REVERSE <list>)
  list(SORT <list> [...])

一、Reading

  • 列表长度

    list(LENGTH <list> <out-var>)
    

    通过 out-var 返回列表的长度。

    set(myList a b c) 	# Creates the list "a;b;c"
    list(LENGTH myList len)
    message("length = ${len}")  # length = 3
    
  • 通过index访问元素

    list(GET <list> <element index> [<index> ...] <out-var>)
    

    其中,index 是列表的索引,可以指定过多个,out-var是通过 index 找到的元素。

    指定索引值时,如果 0 或更大,则从列表开头开始索引,0 表示第一个列表元素。如果为 -1 或更小,则从列表末尾开始索引,-1 表示最后一个列表元素。使用负索引计数时要小心:不是从 0 开始,而是从 -1 开始。-0 相当于 0,即第一个列表元素。这和 Pythonlist 的索引是一致的。

    set(myList a b c) 	# Creates the list "a;b;c"
    list(GET myList 2 1 letters)
    message("letters = ${letters}")   # letters = c;b
    
  • 拼接元素 (CMake 3.12 引入)

    list(JOIN <list> <glue> <out-var>)
    

    使用 <glue> 作为连接符将列表中的元素拼接起来,并通过 out-var 返回拼接结果。

    set(myList a b c) 	# Creates the list "a;b;c"
    list(JOIN myList - join)
    message("join = ${join}")  # join = a-b-c
    
  • 子列表(CMake 3.12 引入)

    list(SUBLIST <list> <begin> <length> <out-var>)
    

    返回给定列表的子列表。如果 <length>0,将返回一个空列表。如果<length>-1 或列表长度小于 <begin>+<length> 则返回列表从 <begin> 到结尾的所有元素。

    set(myList a b c d e) 	# Creates the list "a;b;c;d;e"
    list(SUBLIST myList 1 3 sublist)
    message("sublist[1:3] = ${sublist}")    # sublist[1:3] = b;c;d
    list(SUBLIST myList 1 0 sublist)
    message("sublist[1:0] = ${sublist}")    # sublist[1:0] =
    list(SUBLIST myList 1 -1 sublist)
    message("sublist[1:-1] = ${sublist}")   # sublist[1:-1] = b;c;d;e
    list(SUBLIST myList 2 7 sublist)
    message("sublist[2:7] = ${sublist}")    # sublist[2:7] = c;d;e
    

二、Search

list(FIND <list> <value> <out-var>)

返回列表中指定元素的索引,如果未找到该元素则返回 -1

set(myList a b c d e) 	# Creates the list "a;b;c;d;e"
list(FIND myList d find)
message("find(d) = ${find}")    # find(d) = 3
list(FIND myList g find)
message("find(g) = ${find}")    # find(g) = -1

三、Modification

以下操作会修改原有列表。

  • 在队尾追加元素

    list(APPEND <list> [<element>...])
    

    将元素追加到列表最后。如果 <list> 不存在,则其值将被视为空,并且 <element> 将附加到该空列表中。

    set(myList a b c d e)	# Creates the list "a;b;c;d;e"
    list(APPEND myList 1 2 3)
    message("append(1 2 3) = ${myList}")    # append(1 2 3) = a;b;c;d;e;1;2;3
    list(APPEND newList 1 2 3)
    message("append(1 2 3) = ${newList}")   # append(1 2 3) = 1;2;3
    
  • 在队头插入元素 (CMake 3.15 引入)

    list(PREPEND <list> [<element>...])
    

    将元素插入到列表中的第 0 个位置。如果 <list> 不存在,则其值将被视为空,并且 <element> 将附加到该空列表中。

    set(myList a b c d e)   # Creates the list "a;b;c;d;e"
    list(PREPEND myList 1 2 3)
    message("prepend(1 2 3) = ${myList}")    # prepend(1 2 3) = 1;2;3;a;b;c;d;e
    list(PREPEND newList 1 2 3)
    message("prepend(1 2 3) = ${newList}")   # prepend(1 2 3) = 1;2;3
    
  • 过滤元素 (CMake 3.6 引入)

    list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>)
    

    从列表中包含或排除与 <regex> 匹配的元素。REGEX 表示支持正则表达式。

    set(newList hello hi world)
    list(FILTER newList INCLUDE REGEX h)
    message("newList = ${newList}")     # newList = hello;hi
    set(newList hello hi world)
    list(FILTER newList EXCLUDE REGEX h)
    message("newList = ${newList}")     # newList = world
    
  • 插入元素

    list(INSERT <list> <index> [<element>...])
    

    将元素插入到列表的指定索引处。指定超出范围的索引是错误的。

    有效索引为 0N ,其中 N 是列表的长度。空列表的长度为 0

    如果 <list> 不存在,则其值将被视为空,并且 <element> 将附加到该空列表中。

    set(newList world)
    list(INSERT newList 0 hello)
    message("newList = ${newList}")     # newList = hello;world
    list(INSERT newList 3 null)         # Error
    
  • 从队尾删除元素 (CMake 3.15 引入)

    list(POP_BACK <list> [<out-var>...])
    

    如果未给出 <out-var>,则仅删除最后一个元素。否则,在提供N个 <out-var> 的情况下,将最后N个元素的值分配给给定变量,并从 <list> 中删除最后N个元素。

    set(myList a b c d e)   # Creates the list "a;b;c;d;e;1;2;3"
    list(POP_BACK myList)
    message("myList = ${myList}")  # myList = a;b;c;d;e;1;2
    list(POP_BACK myList a b)
    message("myList = ${myList}, a = ${a}, b = ${b}")    # myList = a;b;c;d;e, a = 2, b = 1
    
  • 从队头删除元素 (CMake 3.15 引入)

    list(POP_FRONT <list> [<out-var>...])
    

    如果未给出 <out-var>,则仅删除第一个元素。否则,在提供N个 <out-var> 的情况下,将前N个元素的值分配给给定变量,并从 <list> 中删除前N个元素。

    set(myList a b c d e 1 2 3)   # Creates the list "a;b;c;d;e;1;2;3"
    list(POP_FRONT myList)
    message("myList = ${myList}")  # myList = b;c;d;e;1;2;3
    list(POP_FRONT myList a b)
    message("myList = ${myList}, a = ${a}, b = ${b}")    # myList = d;e;1;2;3, a = b, b = c
    
  • 按值删除元素

    list(REMOVE_ITEM <list> <value>...)
    

    从列表中删除给定值的所有元素。

    set(myList a b 3 d e 1 2 3)   # Creates the list "a;b;3;d;e;1;2;3"
    list(REMOVE_ITEM myList 1 2 3)
    message("myList = ${myList}")    # myList = a;b;d;e
    
  • 按索引删除元素

    list(REMOVE_AT <list> <index>...)
    

    从列表中删除给定索引处的元素。

    set(myList a b 3 d e 1 2 3)   # Creates the list "a;b;3;d;e;1;2;3"
    list(REMOVE_AT myList 1 2 3)
    message("myList = ${myList}")    # myList = a;e;1;2;3
    
  • 元素去重

    list(REMOVE_DUPLICATES <list>)
    

    删除列表中的重复项目。保留项目的相对顺序,但如果遇到重复项,则仅保留第一个重复的元素。

    set(myList a b 3 d 3 1 2 3)   # Creates the list "a;b;3;d;e;1;2;3"
    list(REMOVE_DUPLICATES myList)
    message("myList = ${myList}")    # myList = a;b;3;d;1;2
    
  • 对元素进行批量变换

    list(TRANSFORM <list> <ACTION> [<SELECTOR>] [OUTPUT_VARIABLE <output variable>])
    

    将变换方法 <ACTION> 应用于每个元素,或应用于 <SELECTOR> 选定的元素,对于输出结果,可以直接对原列表进行修改,也可以输出到 OUTPUT_VARIABLE 指定的变量。

    变换方法 <ACTION> 如下:

    • APPEND、PREPEND

      list(TRANSFORM <list> (APPEND|PREPEND) <value> ...)
      

      将指定值 <value> 附加到列表的每个元素的前面或后面。

    • TOUPPER、TOLOWER

      list(TRANSFORM <list> (TOLOWER|TOUPPER) ...)
      

      将列表的每个元素转换为大写或小写字符。

    • STRIP

      list(TRANSFORM <list> STRIP ...)
      

      删除列表中每个元素前后的空格。

    • GENEX_STRIP

      list(TRANSFORM <list> GENEX_STRIP ...)
      

      删除列表中每个元素的生成器表达式。

    • REPLACE

      list(TRANSFORM <list> REPLACE <regular_expression> <replace_expression> ...)
      

      将与正则表达式 <regular_expression> 匹配的部分替换成 <replace_expression>

    TRANSFORM 还允许使用选择器 <SELECTOR> 选定要执行变换的操作的元素,可用的选择器如下:

    • AT

      list(TRANSFORM <list> <ACTION> AT <index> [<index> ...] ...)
      

      通过索引选择。

    • FOR

      list(TRANSFORM <list> <ACTION> FOR <start> <stop> [<step>] ...)
      

      通过 <start><stop> 指定一个遍历索引的范围,可以选择使用 <step> 定义遍历步长(默认为1)。

    • REGEX

      list(TRANSFORM <list> <ACTION> REGEX <regular_expression> ...)
      

      指定正则表达式。只有与正则表达式匹配的元素才会被转换。

四、Ordering

  • 反转列表

    list(REVERSE <list>)
    

    该操作为就地操作,会修改原有列表。

    set(myList a b c d e 1 2 3)   # Creates the list "a;b;c;d;e;1;2;3"
    list(REVERSE myList)
    message("myList = ${myList}")    # myList = 3;2;1;e;d;c;b;a
    
  • 排序

    list(SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])
    

    默认按 ASCII 码顺序升序排序,区分大小写。

    使用 COMPARE 可以指定排序的方式。(CMake 3.13 引入)

    • STRING

      ASCII 码顺序排序,默认为该项。

    • FILE_BASENAME

      按文件的 basename 对文件 pathname 列表进行排序。

    • NATURAL(CMake 3.18 引入)

      使用自然顺序对字符串列表进行排序。示例如下:

      对于列表 10.0 1.1 2.1 8.0 2.0 3.1

      STRING 模式排序为 1.1 10.0 2.0 2.1 3.1 8.0

      NATURAL 模式排序为 1.1 2.0 2.1 3.1 8.0 10.0

    使用 CASE 可以指定是否区分大小写。(CMake 3.13 引入)

    • SENSITIVE

      区分大小写,默认为该项。

    • INSENSITIVE

      不区分大小写。

    使用 ORDER 可以指定升序或降序。(CMake 3.13 引入)

    • ASCENDING

      按升序对列表进行排序,默认为该项。

    • DESCENDING

      按降序对列表进行排序。文章来源地址https://www.toymoban.com/news/detail-676550.html

到了这里,关于[CMake教程] CMake列表 - list的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python教程(9)——Python变量类型列表list的用法介绍

    在Python中,列表(list)是一种有序、可变的数据结构,用于存储多个元素。列表可以包含不同类型的元素,包括整数、浮点数、字符串等。实际上列表有点类似C++语言中的数组,但仅仅只是类似,和数组还是有点不一样的。列表非常适合利用顺序和位置定位某一元素,尤其是

    2024年02月13日
    浏览(43)
  • 【深度学习】 Python 和 NumPy 系列教程(三):Python容器:1、列表List详解(初始化、索引、切片、更新、删除、常用函数、拆包、遍历)

    目录 一、前言 二、实验环境 三、Python容器(Containers) 0、容器介绍 1、列表(List) 1. 初始化 a. 创建空列表 b. 使用现有元素初始化列表 c. 使用列表生成式 d. 复制列表 2. 索引和切片 a. 索引 b. 负数索引 c. 切片 3. 常用操作(更新、删除) a. 更新单个元素 b. 更新切片 c. 删除单

    2024年02月09日
    浏览(53)
  • 【Python】列表list

    目录 2.1 列表list 1)切片、索引 2)append、extend、insert 3)index、count 4)len、sum、max、min 5)sort、reverse 6)加法(合并)和乘法(重复) 7)列表解析式 索引 列表是一种有序的数据结构,可以存储任意类型的元素。列表中的元素可以通过索引进行访问,索引从 0 开始,表示列表

    2024年02月08日
    浏览(44)
  • list列表可编辑状态

    有时候list需要修改或选择属性,mfc自带的只能显示内容,基本上是不可以修改,为了实现这个功能需求,需要完成一下步骤转换. 第一步记录选择的单元格. 第二步创建一个编辑框CComboBox对象, 设置字体,窗口属性. 第三步获取选中单元格的位置信息. 第四步获取单元格内容信息. 第五

    2024年01月22日
    浏览(35)
  • Python 列表(List)

    目录 访问列表中的值 实例(Python 2.0+) 更新列表 实例(Python 2.0+) 删除列表元素

    2024年02月17日
    浏览(45)
  • 4、python列表Lists

    列表和你可以用它们做的事情。包括索引,切片和变异! Python 中的 List 表示有序的值序列: In [1]: 我们可以把其他类型的事情列入清单: In [2]: 我们甚至可以列一个清单: In [3]: 列表可以包含不同类型的变量: In [4]: 可以使用方括号访问单个列表元素。 哪个行星离太阳最近? Pyt

    2024年01月17日
    浏览(40)
  • Java List(列表)

    List 是一个有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引,第一个添加到 List 集合中的元素的索引为 0,第二个为 1,依此类推。 List 实现了

    2024年02月14日
    浏览(35)
  • python的列表list

    一.添加  二.insert添加 三.extend添加  四.删除remove 五.pop()删除 六.pop(索引)  七.del 删除 八.clear清除内容  

    2024年02月05日
    浏览(52)
  • 列表list

    列表是将数据组织在一个一维集合中,从这个组织方式来看,它与c()函数是相似的。但是,列表并不是将具体的值组织起来,而是组织R对象,如列表、数据框、矩阵、函数、向量等等。 列表非常好用,因为列表可以存放任何类型的数据,都不会出错,这使其成为R中全能型的

    2024年02月15日
    浏览(36)
  • Golang 列表list

    在 Golang 中,list 是一个双向链表实现,可以用来存储任意类型的元素。本文将对 list 进行详细的介绍,包括创建、初始化、添加元素、删除元素、遍历等操作,并提供相应的示例代码。 在 Golang 中,可以使用 list.New() 函数来创建一个新的 list。例如,以下是一个字符串 list 的

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包