【问题标题】:a predicate to check if the values of a container are in a range? [closed]检查容器的值是否在范围内的谓词? [关闭]
【发布时间】:2013-12-04 14:20:13
【问题描述】:

给定一个像std::vector<T> 这样的容器,其中T 是数值量的泛型类型(如intfloat 等...),我想要一个作为参数的谓词:

  • 容器本身
  • 一个范围,一种表示一组数值的类型,或者只是两个极端数值,应该验证谓词
  • 容差,一种表示范围的可能(可选)扩展的类型,以相对术语(如百分比)或绝对术语(使用数字)

我想有一个输出:

  • 谓词的结果
  • 如果范围对于某些数量来说不够用,那么公差是否被某些值“使用”(但谓词仍然是 true

在 C++ 标准库中看起来甚至没有 range 的概念,这对我来说很奇怪,仅仅是因为有很多有趣的算法和类型,但在这种情况下没有任何东西可以满足我的目的.

在继续我自己的道路之前,我想问一下,C++ 库中的类型和算法有类似的东西吗?

【问题讨论】:

  • 听起来像是 std::accumulate 和合适的 lambda 的简单组合。
  • 无需自己努力就可以提出很好的问题。
  • 在标准库中,范围通常由两个单独的值表示,或者std::pair 需要一个值。缺乏明确的“范围”概念很大程度上是由于历史惯性 - 虽然这很好,但认为不值得对库进行大规模更改以支持它。
  • @KerrekSB 因此,对于容器中的每个值,您建议将超出范围的部分“添加”到全局计数器,然后在循环结束时验证计数器?它可以工作,但它确实......我应该努力使它更具功能性和可重用性......
  • @KerrekSB 我宁愿使用std::find_if,因为我们想在发现超出范围的内容时停止。或者,正如 jrok 所说,std::all_of :)

标签: c++ c++11 containers numerical


【解决方案1】:

与其评估集合中每个项目的条件,我想我会先使用std::minmax_element 来查找集合中的最小和最大元素。

从那里,测试result.first < minimum 和/或result.second > maximum 是一个简单的问题。

处理公差基本上就是在扩大范围内重复测试。

至于这是否可能比 std::find_ifstd::all_of 更好,这将取决于您期望在集合中的项目数量以及找到超出允许范围的值的可能性提前退出。我认为您需要对数据有一些了解才能做出有意义的预测。

【讨论】:

  • 该向量包含数百万个值的Ts,但我想我会尝试这 2-3 个解决方案,我想到的唯一区别是它们都是很容易在多线程代码中拆分,但有时bool 比数字结果更容易“管理”。至少考虑一下我的消息队列是如何管理的。
  • 除非你有多个套接字,所以每个 CPU 都有自己的内存总线,多线程在这里可能不会有什么好处(如果有的话)。计算非常简单,内存带宽几乎肯定会成为瓶颈,因此除非您的多线程更改内存带宽,否则它不太可能有帮助。
猜你喜欢
  • 2014-03-28
  • 2014-04-15
  • 2021-08-05
  • 1970-01-01
  • 2023-04-03
  • 2017-07-13
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多