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