在find()中提供boolean是不好的风格?

时间:2013-11-23 12:05:48

标签: c++ iterator find

在“加速C ++:实例编程实例”中,第6.1.3章是来自“算法”库的find()的示例:

我们想检查char是否在字符串中:

bool find_char(char c){
    string str = "asdf";
    return find(str.begin(), str.end(), c) != str.end();
}

然后,有find()的解释:

  

它与find_if类似,不同之处在于它不是调用谓词,而是查找作为第三个参数给出的特定值。与find_if一样,如果存在我们想要的值,则该函数返回一个迭代器,表示给定序列中第一次出现的值。 如果找不到该值,则find返回其第二个参数。

这让我想知道为什么我们不使用更短更清洁的版本:

bool find_char(char c){
    string str = "asdf";
    return find(str.begin(), false, c); //does not compile, see Top Answer
}

这被认为是不好的风格吗?这段代码有问题吗?

3 个答案:

答案 0 :(得分:5)

问题是第二个参数不仅是在大海捞针中找不到针时返回的值,第二个参数也是干草堆本身末端的(指针或迭代器)。将false作为std::find的第二个参数的示例将无法编译,因为false不是任何迭代器,并且当然不能与std::string::begin()进行任何比较或兼容,更不用说形成一个范围的结束。

答案 1 :(得分:2)

你的变体是错误的,因为你的函数总是返回true,因为第二个迭代器不等于零(并且它确实不等于零)。函数find返回一个迭代器(找到的值或该范围的最后一个迭代器)而不是bool值。

答案 2 :(得分:0)

嗯,std::find的主要目的是为找到找到的元素提供迭代器,以防它被找到。所以,这就是std::find返回迭代器的原因。

未找到元素的情况是一种特殊情况,由第二个参数作为结果返回。

如果std::find返回bool,则无法告诉我们它找到目标数据的位置。在你的情况下,你不关心它,但在我们可能的(或大多数)其他情况下。