[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,即第一个列表元素。这和Python中list的索引是一致的。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>...])将元素插入到列表的指定索引处。指定超出范围的索引是错误的。
有效索引为
0到N,其中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中大量使用。初始化列表语法如下: set(myList a b c) # Creates the list "a;b;c"归根结底,列表只是一个由分号分隔列表项的单个字符串,这…...
报错 - net::ERR_ABORTED 500 (Internal Server Error)
报错:net::ERR_ABORTED 500 (Internal Server Error) 根据提示找到对应文件 解决:检查代码,根据高亮颜色判断,发现箭头函数漏了一个>。 报错: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.稀疏数组 稀疏数组(Sparse Array):当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组…...
内存管理框架 --- 基础知识
文章目录 一、内存管理1.1 内存管理的出现1.2 内存管理的用途1.2.1 虚拟内存和物理内存的定义1.2.1.1 什么是虚拟内存? 1.2.2 虚拟内存的划分:用户空间与内核空间 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 框架,它允许你使用 React 框架建立超强的…...
【Java】Java基础
环境准备 安装JDK和JRE 下载JDK,可以在官网Java Downloads | Oracle 中国下载,但是这里需要注册才能够下载。在Index of java-local/jdk (huaweicloud.com)也可以下载到,但是版本比较老,关系不大,直接下载࿰…...
Spring-SpringBoot-SpringMVC-MyBatis常见面试题
文章目录 Spring篇springbean是安全的的?什么是AOP你们工作中有用过AOP吗spring中的事务是如何实现的spring中事务失效场景Spring的生命周期spring中的循坏依赖springMVC的执行流程springboot的启动原理常用注解MyBatis执行流程Mybatis是否支持延迟加载?Mybatis的一…...
15.MyCat数据库分片
MyCat 是一个开源的数据库中间件,主要用于将数据库操作请求路由和分发到后端的多个数据库节点。 1.Mycat环境搭建 在两个不同数据库中创建相同表 下载mycat https://github.com/MyCATApache/Mycat-Serverhttps://github.com/MyCATApache/Mycat-Server 将下…...
【Python】PySpark
前言 Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据…...
pycharm 打开Terminal时报错activate.ps1,因为在此系统上禁止运行脚本,并因此无法进入虚拟环境
pycharm 打开Terminal时报错activate.ps1,因为在此系统上禁止运行脚本,并因此无法进入虚拟环境 如下图所示: 网上说可以set_restrictFalse什么的,虽然也可但可能会降低电脑安全性,可以将下面的终端改为cmd.exe即可...
[C++][C#]yolox TensorRT C++ C#部署
YOLOX是一种新型的高性能探测器,由开发者Zheng Ge、Songtao Liu、Feng Wang、Zeming Li和Jian Sun在《YOLOX: Exceeding YOLO Series in 2021》首次提出。与YOLOV5和YOLOV8相比,YOLOX具有更高的性能和更好的平衡,在速度和精度方面都表现出优越…...
根据源码,模拟实现 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数据库产品中的一种,是最像关系型数据库(MySQL)的非关系型数据库 内部采用BSON(二进制JSON)格式来存储数据,并支持水平扩展。 MongoDB本身并不是完全免费的,它对于…...
vr智慧党建主题展厅赋予企业数字化内涵
现如今,VR全景技术的发展让我们动动手指就能在线上参观博物馆、纪念馆,不仅不用受时间和空间的限制,还能拥有身临其境般的体验,使得我们足不出户就能随时随地学习、传承红色文化。 很多党建展厅都是比较传统的,没有运用…...
go中mutex的sema信号量是什么?
先看下go的sync.mutex是什么 type Mutex struct {state int32sema uint32 } 这里面有个sema,这个就是信号量。 什么是信号量? 什么是信号量?_kina100的博客-CSDN博客 其实通俗的来说,信号量就是信号灯,但是他不是…...
LeetCode笔记:Weekly Contest 360
LeetCode笔记:Weekly Contest 360 0. 吐槽1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-360/ 0.…...
【树DP】2021ICPC南京 H
Problem - H - Codeforces 题意: 思路: 这题应该算是铜牌题 铜牌题 简单算法 基础思维 简单复盘一下思路 首先,我们发现有个很特殊的条件: ti < 3 然后看一下样例: 注意到,对于一个结点 u &#…...
Leedcode19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出:[] 示例 3: 输入࿱…...
Mysql-索引查询相关
一、单表查询 1.1 二级索引为null 不论是普通的二级索引,还是唯一二级索引,它们的索引列对包含 NULL 值的数量并不限制,所以我们采用key IS NULL 这种形式的搜索条件最多只能使用 ref 的访问方法,而不是 const 的访问方法 1.2 c…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
