在这段代码中 string: : npos 是什么意思?

下面的代码片段中的短语 std::string::npos是什么意思?

found = str.find(str2);


if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
166303 次浏览

It means not found.

它通常是这样定义的:

static const size_t npos = -1;

比较 npos 而不是 -1更好,因为代码更加清晰。

如果在搜索字符串中找不到子字符串,则 found将为 npos

string::npos is a constant (probably -1) representing a non-position. It's returned by method find when the pattern was not found.

std::string::npos是实现定义的索引,它总是超出任何 std::string实例的界限。各种 std::string函数返回它或接受它以发出超过字符串末尾的信号。它通常是某种无符号整数类型,它的值通常是 std::numeric_limits<std::string::size_type>::max (),通常与 -1相当(这要感谢标准的整数提升)。

string::npos的文件写道:

Npos 是一个静态成员常量值,具有 size _ t 类型的元素的最大可能值。

作为一个返回值,它通常用于指示故障。

这个常量实际上定义为 -1(对于任何 trait) ,因为 size _ t 是一个无符号整数类型,所以它成为这个类型最大可表示值。

$21.4 - "static const size_type npos = -1;"

它由表示错误/未找到等的字符串函数返回。

size_t是一个无符号变量,因此“无符号值 =-1”自动使其成为 size_t:18446744073709551615的最大值

we have to use string::size_type for the return type of the find function otherwise the comparison with string::npos might not work. 由字符串的分配器定义的 size_type必须是 unsigned 默认的分配器,分配器,使用类型 size_t作为 size_type。因为 -1是 转换为无符号整数类型时,npos 是其类型的最大无符号值, the exact value depends on the exact definition of type size_type. Unfortunately, these maximum 值不同。事实上,如果 类型不同。因此,比较

idx == std::string::npos

might yield false if idx has the value -1 and idx and string::npos have different types:

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
...
}

静态常量 size _ t npos = -1;

Size _ t 的最大值

Npos 是一个静态成员常量值,具有 size _ t 类型的元素的最大可能值。

This value, when used as the value for a len (or sublen) parameter in string's member functions, means "until the end of the string".

作为返回值,它通常用于指示不匹配。

该常量的值定义为 -1,因为 size _ t 是一个无符号整数类型,所以它是此类型最大可表示值。

对于现在的 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: " << position.value() << std::endl;
}

Value of string::npos is 18446744073709551615. Its a value returned if there is no string found.

正如其他人提到的,Npos 是 size _ t 的最大值

下面是它的定义:

static constexpr auto npos{static_cast<size_type>(-1)};

Puzzled that the wrong answer got the vote.

下面是一个快速测试样本:

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;
}

output:

18446744073709551615 == 18446744073709551615 == 18446744073709551615 == 18446744073709551615


...Program finished with exit code 0