当前位置: 首页 > news >正文

[CMake教程] CMake列表 - list

目录

  • 零、简介
  • 一、Reading
  • 二、Search
  • 三、Modification
  • 四、Ordering

零、简介

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

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

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

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

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

Readinglist(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>)Searchlist(FIND <list> <value> <out-var>)Modificationlist(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> [...])Orderinglist(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

      按降序对列表进行排序。

相关文章:

[CMake教程] CMake列表 - list

目录 零、简介一、Reading二、Search三、Modification四、Ordering 零、简介 列表在CMake中大量使用。初始化列表语法如下&#xff1a; set(myList a b c) # Creates the list "a;b;c"归根结底&#xff0c;列表只是一个由分号分隔列表项的单个字符串&#xff0c;这…...

报错 - net::ERR_ABORTED 500 (Internal Server Error)

报错&#xff1a;net::ERR_ABORTED 500 (Internal Server Error) 根据提示找到对应文件 解决&#xff1a;检查代码&#xff0c;根据高亮颜色判断&#xff0c;发现箭头函数漏了一个>。 报错&#xff1a;Uncaught TypeError: Assignment to constant variable. 原因&#x…...

【Java Easypoi Apache poi】 Word导入与导出

引入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId> </dependency> <!-- 下面的版本需要对应上面依赖中的版本 否则可能会起冲突 --> <!-- 下面的依赖主要是为了使用A…...

Java稀疏数组

目录 1.稀疏数组 2.稀疏数组的使用 2.1 二维数组转换为稀疏数组 2.2 稀疏数组转换为二维数组 1.稀疏数组 稀疏数组&#xff08;Sparse Array&#xff09;&#xff1a;当一个数组中的大部分元素为相同的值&#xff0c;可使用稀疏数组来保存该数组&#xff0c;可以将稀疏数组…...

内存管理框架 --- 基础知识

文章目录 一、内存管理1.1 内存管理的出现1.2 内存管理的用途1.2.1 虚拟内存和物理内存的定义1.2.1.1 什么是虚拟内存&#xff1f; 1.2.2 虚拟内存的划分&#xff1a;用户空间与内核空间 1.3 操作系统和MMU1.3.1 OS和MMU的关系1.3.2 虚拟地址到物理地址的映射流程 1.4 物理内存…...

React + Next.js 搭建项目(配有对比介绍一起食用)

文章标题 01 Next.js 是什么02 Next.js 搭建工具 create-next-app03 create-react-app 与 create-next-app 的区别04 快速构建 Next.js 项目05 App Router 与 Pages Router 的区别 01 Next.js 是什么 Next.js 是一个 React 框架&#xff0c;它允许你使用 React 框架建立超强的…...

【Java】Java基础

环境准备 安装JDK和JRE 下载JDK&#xff0c;可以在官网Java Downloads | Oracle 中国下载&#xff0c;但是这里需要注册才能够下载。在Index of java-local/jdk (huaweicloud.com)也可以下载到&#xff0c;但是版本比较老&#xff0c;关系不大&#xff0c;直接下载&#xff0…...

Spring-SpringBoot-SpringMVC-MyBatis常见面试题

文章目录 Spring篇springbean是安全的的?什么是AOP你们工作中有用过AOP吗spring中的事务是如何实现的spring中事务失效场景Spring的生命周期spring中的循坏依赖springMVC的执行流程springboot的启动原理常用注解MyBatis执行流程Mybatis是否支持延迟加载&#xff1f;Mybatis的一…...

15.MyCat数据库分片

MyCat 是一个开源的数据库中间件&#xff0c;主要用于将数据库操作请求路由和分发到后端的多个数据库节点。 1.Mycat环境搭建 在两个不同数据库中创建相同表 下载mycat https://github.com/MyCATApache/Mycat-Serverhttps://github.com/MyCATApache/Mycat-Server 将下…...

【Python】PySpark

前言 Apache Spark是用于大规模数据&#xff08;large-scala data&#xff09;处理的统一&#xff08;unified&#xff09;分析引擎。 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据…...

pycharm 打开Terminal时报错activate.ps1,因为在此系统上禁止运行脚本,并因此无法进入虚拟环境

pycharm 打开Terminal时报错activate.ps1&#xff0c;因为在此系统上禁止运行脚本&#xff0c;并因此无法进入虚拟环境 如下图所示&#xff1a; 网上说可以set_restrictFalse什么的&#xff0c;虽然也可但可能会降低电脑安全性&#xff0c;可以将下面的终端改为cmd.exe即可...

[C++][C#]yolox TensorRT C++ C#部署

YOLOX是一种新型的高性能探测器&#xff0c;由开发者Zheng Ge、Songtao Liu、Feng Wang、Zeming Li和Jian Sun在《YOLOX: Exceeding YOLO Series in 2021》首次提出。与YOLOV5和YOLOV8相比&#xff0c;YOLOX具有更高的性能和更好的平衡&#xff0c;在速度和精度方面都表现出优越…...

根据源码,模拟实现 RabbitMQ - 网络通讯设计,自定义应用层协议,实现 BrokerServer (8)

目录 一、网络通讯协议设计 1.1、交互模型 1.2、自定义应用层协议 1.2.1、请求和响应格式约定 ​编辑 1.2.2、参数说明 1.2.3、具体例子 1.2.4、特殊栗子 1.3、实现 BrokerServer 1.3.1、属性和构造 1.3.2、启动 BrokerServer 1.3.3、停止 BrokerServer 1.3.4、处…...

MongoDB入门

简介 MongoDB是一个开源、高性能、支持海量数据存储的文档型数据库 是NoSQL数据库产品中的一种&#xff0c;是最像关系型数据库&#xff08;MySQL&#xff09;的非关系型数据库 内部采用BSON(二进制JSON)格式来存储数据,并支持水平扩展。 MongoDB本身并不是完全免费的,它对于…...

vr智慧党建主题展厅赋予企业数字化内涵

现如今&#xff0c;VR全景技术的发展让我们动动手指就能在线上参观博物馆、纪念馆&#xff0c;不仅不用受时间和空间的限制&#xff0c;还能拥有身临其境般的体验&#xff0c;使得我们足不出户就能随时随地学习、传承红色文化。 很多党建展厅都是比较传统的&#xff0c;没有运用…...

go中mutex的sema信号量是什么?

先看下go的sync.mutex是什么 type Mutex struct {state int32sema uint32 } 这里面有个sema&#xff0c;这个就是信号量。 什么是信号量&#xff1f; 什么是信号量&#xff1f;_kina100的博客-CSDN博客 其实通俗的来说&#xff0c;信号量就是信号灯&#xff0c;但是他不是…...

LeetCode笔记:Weekly Contest 360

LeetCode笔记&#xff1a;Weekly Contest 360 0. 吐槽1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接&#xff1a;https://leetcode.com/contest/weekly-contest-360/ 0.…...

【树DP】2021ICPC南京 H

Problem - H - Codeforces 题意&#xff1a; 思路&#xff1a; 这题应该算是铜牌题 铜牌题 简单算法 基础思维 简单复盘一下思路 首先&#xff0c;我们发现有个很特殊的条件&#xff1a; ti < 3 然后看一下样例&#xff1a; 注意到&#xff0c;对于一个结点 u &#…...

Leedcode19. 删除链表的倒数第 N 个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1…...

Mysql-索引查询相关

一、单表查询 1.1 二级索引为null 不论是普通的二级索引&#xff0c;还是唯一二级索引&#xff0c;它们的索引列对包含 NULL 值的数量并不限制&#xff0c;所以我们采用key IS NULL 这种形式的搜索条件最多只能使用 ref 的访问方法&#xff0c;而不是 const 的访问方法 1.2 c…...

C++ Pimpl

Pimpl(Pointer to implementation&#xff0c;指向实现的指针) 是一种减少代码依赖和编译时间的C编程技巧&#xff0c;其基本思想是将一个外部可见类(visible class)的实现细节&#xff08;一般是所有私有的非虚成员&#xff09;放在一个单独的实现类(implementation class)中&…...

rust学习-类型转换

基本类型转换 // 不显示类型转换产生的溢出警告。 #![allow(overflowing_literals)]fn main() {let decimal 65.4321_f32;// 错误&#xff01;不提供隐式转换// let integer: u8 decimal;// 可以显式转换let integer decimal as u8;let character integer as char;println…...

算法通过村第四关-栈青铜笔记|手写栈操作

文章目录 前言1. 栈的基础概要1.1 栈的特征1.2 栈的操作1.3 Java中的栈 2. 栈的实现&#xff08;手写栈&#xff09;2.1 基于数组实现2.2 基于链表实现2.3 基于LinkedList实现 总结 前言 提示&#xff1a;我自己一个人的感觉很好 我并不想要拥有你 除非你比我的独处更加宜人 --…...

Python计算加速利器

迷途小书童的 Note 读完需要 6分钟 速读仅需 2 分钟 1 简介 Python 是一门应用非常广泛的高级语言&#xff0c;但是&#xff0c;长久以来&#xff0c;Python的运行速度一直被人诟病&#xff0c;相比 c/c、java、c#、javascript 等一众高级编程语言&#xff0c;完全没有优势。 那…...

PyTorch 深度学习实践 第10讲刘二大人

总结&#xff1a; 1.输入通道个数 等于 卷积核通道个数 2.卷积核个数 等于 输出通道个数 1.单通道卷积 以单通道卷积为例&#xff0c;输入为&#xff08;1,5,5&#xff09;&#xff0c;分别表示1个通道&#xff0c;宽为5&#xff0c;高为5。假设卷积核大小为3x3&#xff0c…...

Linux特殊指令

目录 1.dd命令 2.mkfs格式化 3.df命令 4.mount实现硬盘的挂载 5.unshare 1.dd命令 dd命令可以用来读取转换并输出数据。 示例一&#xff1a; if表示infile&#xff0c;of表示outfile。这里的/dev/zero是一个特殊文件&#xff0c;会不断产生空白数据。 bs表示复制一块的大…...

MPI之主从模式的一般编程示例

比如&#xff0c;我们可以选举0号进程为master进程&#xff0c;其余进程为slaver进程 #include "mpi.h" #include <unistd.h> #include <iostream>int main(int argc, char *argv[]) {int err MPI_Init(&argc,&argv);int rank,size;MPI_Comm_r…...

基于野狗算法优化的BP神经网络(预测应用) - 附代码

基于野狗算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于野狗算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.野狗优化BP神经网络2.1 BP神经网络参数设置2.2 野狗算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…...

C语言面向对象的编程思想

面向对象编程 面向对象编程Object-Oriented Programming&#xff0c;OOP&#xff09; 作为一种新方法&#xff0c;其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征&#xff0…...

MPI之非阻塞通信中通信完成检测接口简介

在之前的文章中&#xff0c;简单的写了一个非阻塞的通信代码介绍最最基本的使用&#xff1a; int main(int argc, char *argv[]) {int err MPI_Init(&argc,&argv);int rank,size;MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD, &size);…...