【问题标题】:What's the predicate in C++? [duplicate]C++ 中的谓词是什么? [复制]
【发布时间】:2012-11-27 01:59:12
【问题描述】:

可能重复:
What is predicate in C++?

当我阅读 C++ 入门时,有一个定义的术语是 predicate

定义是这样的:

返回可转换为布尔类型的函数。通常由通用算法用来测试元素。库使用的谓词要么是一元的(接受一个参数),要么是二元的(接受两个)。

任何返回可以转换为布尔类型的类型都可以是谓词!对?或者还有其他一些限制条件。

谢谢!

【问题讨论】:

  • 假设您要删除字符串中的所有元音。通常,您会执行类似于(为简单起见忽略erase 调用)std::remove_if(std::begin(str), std::end(str), isVowel); 的操作。在这种情况下,isVowel 是谓词,它接受一个字符,如果是元音则返回 true。您可以将此概念应用于任何此类性质的事物。
  • 正式地在 C++ 中,没有定义什么是谓词,它来自许多 C++ 标准库函数的命名参数的逻辑。就像在InputIterator find_if(InputIterator first, InputIterator last, Predicate pred) 中一样。顺便说一句,函子也可以是与这些函数一起使用的谓词。
  • @jogojapan 是的。但它已经关闭了。我想了解有关它的更多信息。谢谢!

标签: c++


【解决方案1】:

在 C++ 上下文中没有正式的谓词定义(我反正知道),但它通常意味着可以在真/假上下文中使用的函数。

这是来自 cppreference 的 count_if 的可能实现,它说明了它在说什么:

template<class InputIt, class UnaryPredicate>
typename iterator_traits<InputIt>::difference_type
    count_if(InputIt first, InputIt last, UnaryPredicate p)
{
    typename iterator_traits<InputIt>::difference_type ret = 0;
    for (; first != last; ++first) {
        if (p(*first)) {
            ret++;
        }
    }
    return ret;
}

p 必须返回可以在if 语句中使用的内容,这基本上可以归结为。

例如:

class T {};

T f(int x)
{
    return T();
}

这不是 count_if 的有效谓词,因为 T 不能隐式转换为布尔值。

换句话说:

if (f(4)) { }

是不可编译的代码。

但是,如果 T 可以隐式转换为布尔值,f 将是一个可接受的谓词(尽管很奇怪)。

【讨论】:

  • 很有用。非常感谢。
猜你喜欢
  • 2010-12-15
  • 2011-08-20
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
相关资源
最近更新 更多