我有一个包含数千个条目的 CMake 列表,我想在其中查找(而不是删除!)所有重复项。有没有一种聪明的方法,无需循环遍历整个列表并进行大量搜索?
我的问题:
list REMOVE_DUPLICATES
没有显示哪些重复项已删除list FIND
只查找第一次出现的情况。它没有显示整个列表中有多少次出现list FIND
仅适用于整个列表。我无法告诉它从某个索引开始查找。我会使用的方法(但不喜欢):
1. stepping through each entry of the list n=0..length-1
2. create a sublist for entries n..length
3. use `list FIND` on the sublist to search for the current entry
4. if `FIND` was successful, we have a duplicate and know the index (n and search result)
这可行,但对我来说看起来非常庞大,因为它必须创建数千个子列表..CMake 真的没有提供更好的方法吗?
可以使用
list SORT
遍历一次。
list(SORT entries entriesSorted)
set(duplicates)
list(GET entriesSorted 0 previousEntry)
foreach (i IN LIST entriesSorted)
if (i EQUALS previousEntry)
list(APPEND duplicates i)
else()
set(previousEntry i)
duplicates
包含所有重复项。如果有 n > 2 个相同的条目,duplicates will contain n-1 of these elements. Removing duplicates in
duplicates` 可以修复此问题。
复杂度:O(n log(n)) + O(n)