如何获取CMake列表中的最大元素?(支持未排序、含重复场景)
在CMake中获取列表的最大值元素
下面介绍两种可靠的实现方式,适用于无序、包含重复元素的CMake列表(字面量或变量存储均可):
方法一:手动遍历比较
通过遍历列表元素,逐个比较并更新最大值,时间复杂度为O(n),效率更高,且不会修改原列表。
# 定义目标列表(可以是字面量或已存在的变量) set(MyList 5 2 9 3 9 1) # 处理空列表的边界情况 if(NOT MyList) message(WARNING "无法获取最大值:目标列表为空") return() endif() # 初始化最大值为列表第一个元素 list(GET MyList 0 max_value) # 遍历所有元素,更新最大值 foreach(item IN LISTS MyList) if(item GREATER max_value) set(max_value ${item}) endif() endforeach() # 输出结果 message(STATUS "列表最大值:${max_value}")
方法二:排序后取末尾元素
利用CMake内置的list(SORT)命令对列表升序排序,排序后的最后一个元素即为最大值,代码更简洁,但会产生排序的额外开销(时间复杂度O(n log n))。
set(MyList 5 2 9 3 9 1) if(NOT MyList) message(WARNING "无法获取最大值:目标列表为空") return() endif() # 复制原列表避免修改原始数据(可选,若不需要保留原列表可省略) set(sorted_list ${MyList}) # 对列表进行升序排序 list(SORT sorted_list) # 取排序后列表的最后一个元素(索引-1表示末尾) list(GET sorted_list -1 max_value) message(STATUS "列表最大值:${max_value}")
注意事项
- 两种方法都兼容整数类型的列表元素;如果列表包含非数值元素,比较逻辑会失效,需要额外处理类型校验。
- 务必添加空列表的判断逻辑,避免
list(GET)命令报错。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

