为什么C ++标准保留了这样的冗余功能?

时间:2016-12-27 07:21:44

标签: c++ string c++11 standards

  1. std::string::find&#39}原型:

    size_type find( CharT ch, size_type pos = 0 ) const;
    
  2. std::string::find_first_of&#39}原型:

    std::size_type find_first_of( CharT ch, size_type pos = 0 ) const;
    
  3. 两者都具有相同的功能。但显而易见的是,后者是多余的。

    我认为这种冗余会让用户感到困惑,因为find_first_of意味着"找到任何给定角色"而不是"找到给定角色"。

    为什么C ++标准会保留这样的冗余功能?

3 个答案:

答案 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::findstd::string::find_first_of没有做同样的功能。

std::string::find

  

查找与给定字符序列相等的第一个子字符串。搜索从pos开始,即找到的子字符串不得在pos之前的位置开始。

std::string::find_first_of

  

查找与给定字符序列中的一个字符相等的第一个字符。搜索仅考虑区间[pos,size())。

仅对于该集合的情况是单个字符,参数为CharT,这两个函数重合重复。