我正在编写一本关于C++的书,它只是string::npos用来检查字符串中是否存在字符位置.我不明白这个机制怎么可能知道我指的是哪个字符串呢!此特定代码计算子字符串的出现次数.
码:
for (int i=cats.find("cat",0);i!=string::npos;i=cats.find("cat",i)) {
++catCount;
++i;
}
Run Code Online (Sandbox Code Playgroud)
我明白它是在第一次出现的时候开始循环,每次通过都会递增计数器以避免计算两次相同的子串,然后在每次循环结束时计数器跳转到下一次出现的位置子串.当计数器不存在作为字符串的字符索引时,循环停止.
虽然这个字符串被称为"猫",但在"string :: npos"中找不到"cats",所以如何知道这是我甚至在搜索的变量?是因为那是最后一个要调用的变量.find()吗?
谢谢!
如果find找不到你要找的东西,它会返回一个哨兵值,std::string::npos.没有必要知道关于字符串本身的任何信息.所需要的只是返回一个不能成为有效索引的值.
例如,它可以实现为:
static const size_t npos = std::numeric_limits<size_t>::max();
size_t string::find(...)
{
// if we didn't find it...
return npos;
}
Run Code Online (Sandbox Code Playgroud)
此外,您不应该使用an int来存储返回值,因为它不是返回值find.如果你有一个很长的字符串并且返回的索引是> numeric_limits<int>.max()?那么现在你已经调用了未定义的行为.
find返回一个std::string::size_type. std::string::npos是该类型的常量,当找不到该值时返回该常量.
请注意,这std::string::size_type是一个unsigned值,并int已签名.如果std::string::npos不能表示为a int,则转换为std::string::nposto int是未定义的行为.
所以,你真的不应该存储的返回值std::string::find在int.相反,您应该将其存储std::string::size_type在C++ 11或C++ 11中auto. baisc_string<char> size_type是std::size_t,因为是大多数其他专业.