使用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 ++标准库的不完美,不是吗?
答案 0 :(得分:4)
我在这里看不到任何不对称。事实恰恰相反,它似乎是完全对称的。只需将find_first_of
视为从某个起始位置搜索右侧,而find_last_of
是从某个起始位置搜索左侧。 / p>
名称find_last_of
有一个误导性的质量:它意味着一个自然的前进搜索,除了我们返回最后一个匹配而不是第一个匹配。但是,对于双向序列,可以忽略名称的“前向”性质,并将其视为向后搜索。向后搜索也会返回第一个匹配项,它只是从起始点开始到左侧。从这个角度来看,该函数与find_first_of
对称。
编辑:阅读完您的评论后,我终于理解了您的观点。因此,问题是pos
参数的当前语义使得无法为find_last_of
指定空搜索区域。是的,这是有道理的。我同意,这确实可以被视为find_last_of
设计中的不一致。
出于一致性目的,我实际上希望find_last_of
在pos
值方面不具有包容性。在这种情况下,xpos
返回的find_last_of
目标位置的规范将是
xpos< pos和xpos<大小();
在这种情况下,s.find_last_of(c, 0)
将搜索空前缀,而s.find_last_of(c, s.size())
将搜索整个字符串。
然而标准说
xpos< = pos和xpos<大小();
我真的不知道为什么他们决定给pos
参数赋予这样的包容性含义。可能他们认为这样会更容易理解。