C++根据限定谓词压缩数组

C++ compacting an array according to a qualification predicate

本文关键字:谓词 压缩 数组 C++      更新时间:2023-10-16

这个问题的目标是寻找更好/最好的方法来实现所需的功能。由于我只熟悉C++STL的一部分,所描述的函数可能已经是C++STL中的某种形式/模式/算法。一个更好的设计/实现,或者给我一个好的STL函数来处理这将是受欢迎的。

现在的问题是。。。

假设我有一个类型为foo的数组和一个谓词函数pred,比如

foo bar[100];
bool pred(const foo *p);

我想通过应用谓词pred作为限定函数来压缩数组:不合格项(即当pred返回false时(将从数组中删除,之后的所有元素都应该向前移动。

我的第一个想法是写一个更通用的模板,这样这个操作就可以在所有类型上完成:

template <typename IteratorType>
IteratorType CompactAnArray(IteratorType first, IteratorType last, bool (*pred)(IteratorType));

这个函数应该在[first..last(的范围内,使用预测函数pred来完成所描述的工作。返回值应该是新形成的"Array"的结束迭代器。如果我需要知道新数组的大小,我可以使用std::distance()来计算我的数组(比如bar(和模板函数的返回值之间的距离。

我确实有一个简单的实现这个模板函数大约30行。然而,我想知道C++STL是否已经有了解决方案。

您想要std::remove_if:

从范围〔first,last〕中删除所有满足特定条件的元素,并为范围的新端返回一个经过端迭代器。

移除是通过移动(通过移动分配(范围中的元素来完成的,以使不需要移除的元素出现在范围的开头。保留的元素的相对顺序保持不变,容器的物理大小保持不变。