3

使用 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++ 标准库的一个缺陷,不是吗?

4

1 回答 1

4

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

这个名字find_last_of有一种误导性:它暗示了一种自然的前向搜索,除了我们返回最后一次出现而不是第一次出现。然而,对于双向序列,人们可以忽略名称的“前向”性质,并将其视为后向搜索。向后搜索也返回第一次出现,它只是从起点向左前进。从这个角度来看,函数与 对称find_first_of

编辑:阅读您的评论后,我终于明白了您的观点。因此,问题在于参数的当前语义使得pos无法为. 是的,这是有道理的。我同意,这确实可以看作是设计上的不一致。find_last_offind_last_of

出于一致性目的,我实际上希望在价值find_last_of方面不具有包容性posxpos在这种情况下,返回的目标位置的规范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参数赋予如此包容的意义。可能他们认为这样会更容易理解。

于 2013-02-07T09:22:30.920 回答