std::string::find&#39}原型:
size_type find( CharT ch, size_type pos = 0 ) const;
std::string::find_first_of&#39}原型:
std::size_type find_first_of( CharT ch, size_type pos = 0 ) const;
两者都具有相同的功能。但显而易见的是,后者是多余的。
我认为这种冗余会让用户感到困惑,因为find_first_of
意味着"找到任何给定角色"而不是"找到给定角色"。
为什么C ++标准会保留这样的冗余功能?
答案 0 :(得分:5)
它们之间存在微妙差异。 Bjarne将其用法澄清为:
find_∗_of()
函数与find()
和rfind()
的区别在于查找单个字符,而不是整个序列字符。string s {"accdcde"}; auto i1 = s.find("cd"); // i1==2 s[2]=='c' && s[3]=='d' auto i2 = s.rfind("cd"); // i2==4 s[4]=='c' && s[5]=='d' auto i3 = s.find_first_of("cd"); // i3==1 s[1]=='c' auto i4 = s.find_last_of("cd"); // i4==5 s[5]=='d'
修改:
正如@juanchopanza正确观察到的那样,这种澄清与OP提出的重载版本(采用char
)并不完全相关。
背后有什么理由吗?
IMO,find_first_of( char, pos)
可以作为一个例子来提供与对应的签名 find_last_of( char, pos)
的一致性,与find(char, pos)
相比具有相反的功能。从左到右。
请注意,find(char, pos)
可以取代find_first_of( char, pos)
,但不能取代find_last_of( char, pos)
。缺少find_first_of( char, pos)
可能会导致开发人员产生一些混淆,因此最好还有这个重载版本。
答案 1 :(得分:3)
我不是标准化委员会的成员,但不难解释原因。
find()
和find_first_of()
都是函数系列。
find()
找到子字符串。 find_first_of()
找到匹配的第一个参数中的第一个字符。当只指定一个字符时,在两种情况下,它们都会做同样的事情。
通常,如果使用此类函数来解析字符串,开发人员将使用find()
的多个重载(搜索子字符串)或find_first_of()
的多个重载(搜索单个字符,符合某些标准),而不是使用两者的混合,并依赖于所使用的各种函数之间的逻辑一致性。
虽然可以将两者混合(逻辑上),但强制使用find_first_of()
的开发人员使用find()
,反之亦然,这使得代码更难以推理,因此更难以正确,更难维护。
指定此类功能的努力(在标准中,开发此类功能的努力(一次,每次实现)远远少于许多开发人员不得不更加思考他们使用的功能,因此必须工作的努力更难让他们的程序正常工作,然后维护。
答案 2 :(得分:1)
std::string::find
和std::string::find_first_of
没有做同样的功能。
查找与给定字符序列相等的第一个子字符串。搜索从pos开始,即找到的子字符串不得在pos之前的位置开始。
查找与给定字符序列中的一个字符相等的第一个字符。搜索仅考虑区间[pos,size())。
仅对于该集合的情况是单个字符,参数为CharT
,这两个函数重合重复。