string :: find_first_of和string :: find_last_of的不对称

时间:2013-02-07 09:15:59

标签: c++

使用C ++标准库中的成员函数string :: find_first_of,您可以搜索空子字符串:

 s.find_first_of(c, s.size())

s.find_first_of(c, string::npos)

但是你不能用string::find_last_of搜索空的子字符串;下一个调用将搜索包含(仅)第一个字符的子字符串:

 s.find_last_of(c, 0)

我认为这是C ++标准库的不完美,不是吗?

1 个答案:

答案 0 :(得分:4)

我在这里看不到任何不对称。事实恰恰相反,它似乎是完全对称的。只需将find_first_of视为从某个起始位置搜索右侧,而find_last_of是从某个起始位置搜索左侧。 / p>

名称find_last_of有一个误导性的质量:它意味着一个自然的前进搜索,除了我们返回最后一个匹配而不是第一个匹配。但是,对于双向序列,可以忽略名称的“前向”性质,并将其视为向后搜索。向后搜索也会返回第一个匹配项,它只是从起始点开始到左侧。从这个角度来看,该函数与find_first_of对称。

编辑:阅读完您的评论后,我终于理解了您的观点。因此,问题是pos参数的当前语义使得无法为find_last_of指定搜索区域。是的,这是有道理的。我同意,这确实可以被视为find_last_of设计中的不一致。

出于一致性目的,我实际上希望find_last_ofpos值方面不具有包容性。在这种情况下,xpos返回的find_last_of目标位置的规范将是

  

xpos< pos和xpos<大小();

在这种情况下,s.find_last_of(c, 0)将搜索空前缀,而s.find_last_of(c, s.size())将搜索整个字符串。

然而标准说

  

xpos< = pos和xpos<大小();

我真的不知道为什么他们决定给pos参数赋予这样的包容性含义。可能他们认为这样会更容易理解。