在“加速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
}
这被认为是不好的风格吗?这段代码有问题吗?
答案 0 :(得分:5)
问题是第二个参数不仅是在大海捞针中找不到针时返回的值,第二个参数也是干草堆本身末端的(指针或迭代器)。将false
作为std::find
的第二个参数的示例将无法编译,因为false
不是任何迭代器,并且当然不能与std::string::begin()
进行任何比较或兼容,更不用说形成一个范围的结束。
答案 1 :(得分:2)
你的变体是错误的,因为你的函数总是返回true,因为第二个迭代器不等于零(并且它确实不等于零)。函数find返回一个迭代器(找到的值或该范围的最后一个迭代器)而不是bool值。
答案 2 :(得分:0)
嗯,std::find
的主要目的是为找到找到的元素提供迭代器,以防它被找到。所以,这就是std::find
返回迭代器的原因。
未找到元素的情况是一种特殊情况,由第二个参数作为结果返回。
如果std::find
返回bool
,则无法告诉我们它找到目标数据的位置。在你的情况下,你不关心它,但在我们可能的(或大多数)其他情况下。