CMake:如何查找列表中所有匹配的条目

问题描述 投票:0回答:1

我有一个包含数千个条目的 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 cmake find
1个回答
0
投票

可以使用

list SORT
遍历一次。

  1. 对您的列表进行排序。
    list(SORT entries entriesSorted)
  2. 创建重复项列表
    set(duplicates)
  3. 存储第一个元素并创建剩余元素的列表
    list(GET entriesSorted 0 previousEntry)

    `列表(POP_FRONT 条目已排序)
  4. 迭代列表
    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)

© www.soinside.com 2019 - 2024. All rights reserved.