【问题标题】:C++ compacting an array according to a qualification predicateC++ 根据限定谓词压缩数组
【发布时间】:2018-07-16 08:46:45
【问题描述】:

这个问题的目标是寻找更好/最好的方法来实现所需的功能。由于我只熟悉 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));

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

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

【问题讨论】:

  • 哎呀...它需要 C++17 及更高版本。我只有 C++11。叹息……

标签: c++ stl


【解决方案1】:

你想要std::remove_if:

从范围 [first, last) 中删除所有满足特定条件的元素,并为范围的新结束返回一个过去的迭代器。

移除是通过移动(通过移动赋值的方式)范围内的元素来完成的,使得不被移除的元素出现在范围的开头。保留元素的相对顺序,容器的物理大小不变。

【讨论】:

  • @RobinHsu Nah,std::remove_if 来自 C++98
  • 你是对的。 “直到”部分可以使用。谢谢。
猜你喜欢
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多