string::npos 在这段代码中是啥意思?
Posted
技术标签:
【中文标题】string::npos 在这段代码中是啥意思?【英文标题】:What does string::npos mean in this code?string::npos 在这段代码中是什么意思? 【发布时间】:2011-04-19 04:20:30 【问题描述】:下面这段代码中的std::string::npos
是什么意思?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
【问题讨论】:
【参考方案1】:表示没有找到。
通常是这样定义的:
static const size_t npos = -1;
最好与 npos 进行比较而不是 -1,因为代码更易读。
【讨论】:
比较 == -1 也可能使一些人认为他们可以将其转换为 只是想知道是否有人遇到过这个问题,还是只有我……我在 Windows 中运行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
进行比较
@user1135469 如果您看到 codaddict bellow (***.com/a/3827997/752842) 或 Sebastian Raschka 的回答,我认为您得到的将是有意义的。我建议使用 npos,因为我尝试使用 -1,但在我使用它的条件下它无法正常工作。【参考方案2】:
string::npos
是一个常量(可能是-1
),代表一个非位置。未找到模式时,由方法 find
返回。
【讨论】:
+1 用于实际显示易于记忆的 npos = no-pos 推导。很明显,一旦你知道它就不会考虑它,但对于第一次看到这些字母的人来说,它可能不会点击......? 错在47个级别...npos是size_t,这意味着它不能是负数...真正的意思是max_index,18446744073709551615 for 64 bit size_t【参考方案3】:string::npos
的文档说:
npos 是一个静态成员常量值,对于 size_t 类型的元素具有最大可能值。
作为返回值,通常用于表示失败。
这个常数实际上是用 -1 的值定义的(对于任何 trait),因为 size_t 是一个无符号整数类型,所以它成为该类型的最大可能表示值。
【讨论】:
【参考方案4】:size_t
是一个无符号变量,因此“无符号值 = - 1”自动使其成为 size_t
的最大可能值:18446744073709551615
【讨论】:
size_t 对于 32 位编译器是无符号整数; unsigned long long int 用于 64 位编译器。将其设置为 -1 使其具有该无符号类型的最大值。【参考方案5】:std::string::npos
是实现定义的索引,始终超出任何std::string
实例的范围。各种std::string
函数返回或接受它以发出超出字符串结尾的信号。它通常是一些无符号整数类型,它的值通常是std::numeric_limits<std::string::size_type>::max ()
,这(感谢标准整数提升)通常与-1
相当。
【讨论】:
【参考方案6】:found
将是npos
,以防在搜索字符串中找不到子字符串。
【讨论】:
【参考方案7】:我们必须使用 string::size_type
作为 find 函数的返回类型,否则与 string::npos
的比较可能不起作用。
size_type
,由字符串的分配器定义,必须是unsigned
积分型。默认分配器 allocator 使用类型size_t
作为size_type
。因为-1
是
转换为无符号整数类型,npos 是其类型的最大无符号值。然而,
确切的值取决于类型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
...
【讨论】:
【参考方案8】:$21.4 - "static const size_type npos = -1;"
它由指示错误/未找到等的字符串函数返回。
【讨论】:
【参考方案9】:当我们有 std::optional
时,对这些天 C++17 的回答:
如果你眯着眼睛假装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;
【讨论】:
【参考方案10】:string::npos 的值为 18446744073709551615。如果没有找到字符串,则返回该值。
【讨论】:
实际值是实现定义的,无关紧要。然而,在实践中,18446744073709551615
的值是 64 位 std::size_t
的典型值,它是最大 64 位无符号值。【参考方案11】:
static const size_t npos = -1;
size_t 的最大值
npos 是一个静态成员常量值,对于 size_t 类型的元素具有最大可能值。
这个值,当用作字符串成员函数中 len(或 sublen)参数的值时,意思是“直到字符串的结尾”。
作为返回值,通常用于表示不匹配。
这个常数定义为 -1,因为 size_t 是一个无符号整数类型,它是这个类型的最大可能表示值。
【讨论】:
【参考方案12】:正如其他人提到的,string::npos 是 size_t 的最大值。
这是它的定义:
static constexpr auto nposstatic_cast<size_type>(-1);
疑惑的是,错误的答案得到了投票。
这是一个快速测试示例:
int main()
string s = "C :";
size_t i = s.rfind('?');
size_t b = size_t (-1);
size_t c = (size_t) -1;
cout<< i <<" == " << b << " == " << string::npos << " == " << c;
return 0;
输出:
18446744073709551615 == 18446744073709551615 == 18446744073709551615 == 18446744073709551615
...Program finished with exit code 0
【讨论】:
以上是关于string::npos 在这段代码中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章