`std::string::find_last_of()` 实际上是如何工作的?

6
string s = "I Like C++ Tutorial";
cout << s.find_last_of("Like"); 

我知道find_last_of返回最后一个匹配的字符,但它返回16,这是字母iTutorial中的位置。但我很困惑,因为我正在寻找Like而不是i的最后位置,我尝试从字符串中删除i。它返回了我期望的5。但问题是为什么它返回16


9
阅读文档以了解为什么 find_last_of 会表现出那种方式,如果您想要在字符串末尾匹配子字符串,则应使用 rfind - EdChum
2个回答

8

find_last_of函数可以查找给定字符序列中最后一个与目标字符串中任一字符相等的字符。

字符序列为"Like"。其中,最后一个L在位置3,最后一个i在位置16,最后一个k在位置4,最后一个e在位置5。因此,它返回了这些值中的最大值16

如果字符序列为"like"而不是"Like",则会返回18,因为最后一个l在位置18

如果字符序列中没有任何一个字符与目标字符串中的字符匹配,则返回npos


可能需要注意一下,如果找不到元素的情况下它会做什么,例如搜索“Likes”找不到“s”。 - Caleth
npos 是否为 -1 是真的吗?我可以这样认为吗? - Jackt
@Jackt,它的定义是 static const size_type npos = -1;,但是单独的 -1int 类型,而不是 std::string::size_type - Caleth

3

std::find_last_of

的英译中:

查找与字符串str中任一字符相等的最后一个字符

这意味着在字符串"I Like C++ Tutorial"中搜索字符串"Like"时,两个字符串中最后出现的相同字符是位于位置16的"i"。

如果要搜索完整字符串,请使用std::find

std::string s("I Like C++ Tutorial");
std::cout << s.find("Like"); // prints 2

如果你想找到字符串的最后一个出现位置,可以使用std::rfind函数。
std::string s("I Like C++ Tutorial Like");
std::cout << s.rfind("Like"); // prints 20

要获得最后一个匹配字符的位置,只需将字符串长度加上它的位置。
std::string s("I Like C++ Tutorial Like");
std::string s2("Like");
std::cout << s.rfind(s2) + s2.length(); // prints 24

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接