std::string::npos
在以下代码片段中,该短语是什么意思?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Answers:
这意味着找不到。
通常定义如下:
static const size_t npos = -1;
最好与npos而不是-1进行比较,因为代码更易读。
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
得到pos:4294967295 npos: 4294967295
了,但是在Mac上却得到了pos:4294967295 npos: 18446744073709551615
。这似乎不对...我建议以任何方式进行比较,-1
而不是std::string::npos
string::npos
是-1
表示一个非位置的常数(可能是)。find
找不到模式时,由方法返回。
文件string::npos
说明:
npos是一个静态成员常量值,对于类型为size_t的元素,其最大值可能。
作为返回值,通常用于指示失败。
实际上,此常数定义为-1(对于任何特征),因为size_t是无符号整数类型,因此它成为该类型可能的最大可表示值。
size_t
是一个无符号变量,因此“无符号值=-1”会自动使其size_t
变为可能的最大值:18446744073709551615
我们必须使用string::size_type
find函数的返回类型,否则与之比较string::npos
可能不起作用。
size_type
由字符串的分配器定义,必须是unsigned
整数类型。默认分配器allocator使用type size_t
作为size_type
。因为-1
被转换为无符号整数类型,所以npos是其类型的最大无符号值。但是,确切的值取决于type的确切定义size_type
。不幸的是,这些最大值不同。实际上,如果类型的大小(unsigned long)-1
不同,(unsigned short)-
则该值不同于1。因此,比较
idx == std::string::npos
如果idx具有值-1
和idx并且string::npos
具有不同的类型,则可能会产生false :
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
避免此错误的一种方法是检查搜索是否直接失败:
if (s.find("hi") == std::string::npos) {
...
}
但是,通常需要匹配字符位置的索引。因此,另一个简单的解决方案是为npos定义自己的签名值:
const int NPOS = -1;
现在比较看起来有些不同,甚至更加方便:
if (idx == NPOS) { // works almost always
...
}
npos只是一个令牌值,它告诉您find()找不到任何东西(可能是-1或类似的东西)。find()检查参数的第一次出现,并返回参数开始的索引。例如,
string name = "asad.txt";
int i = name.find(".txt");
//i holds the value 4 now, that's the index at which ".txt" starts
if (i==string::npos) //if ".txt" was NOT found - in this case it was, so this condition is false
name.append(".txt");
当我们有C ++ 17这些天的答案时std::optional
:
如果您斜视一下并假装std::string::find()
返回一个std::optional<std::string::size_type>
(有点儿应该...)-那么条件变为:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
string :: npos的值为18446744073709551615。如果未找到字符串,则返回其值。
18446744073709551615
是64位的典型值std::size_t
,它是最大的64位无符号值。