什么是string :: npos的意思
语句string::npos
在这里表示什么?
found=str.find(str2); if (found!=string::npos) cout << "first 'needle' found at: " << int(found) << endl;
这意味着没有find。
通常这样定义:
static const size_t npos = -1;
因为代码更清晰,所以最好和npos比较,而不是-1。
string::npos
是一个表示非位置的常量(可能是-1
)。 当find
模式时,它通过方法find
返回。
string::npos
文件说:
npos是一个静态成员常量值,对于size_ttypes的元素具有最大的可能值。
作为返回值,通常用于表示失败。
这个常量实际上是用值-1(对于任何特征)定义的,因为size_t是一个无符号整型,成为这种types最大的可表示值。
size_t
是一个无符号variables,因此'unsigned value = – 1'会自动使它成为size_t
的最大可能值:18446744073709551615
std::string::npos
是实现定义的索引,它总是超出任何std::string
实例的范围。 各种各样的std::string
函数返回它或者接受它在string情况结束之后发出信号。 它通常是一些无符号的整数types,它的值通常是std::numeric_limits<std::string::size_type>::max ()
这是(感谢标准整数促销)通常可以比较-1
。
如果在searchstring中找不到子string,将found
npos
。
我们必须使用string::size_type
作为查找函数的返回types,否则与string::npos
的比较可能不起作用。 由string的分配器定义的size_type
必须是unsigned
整数types。 默认分配器allocator使用type size_t
作为size_type
。 由于-1
被转换为无符号整型,因此npos是其types的最大无符号值。 但是,确切的值取决于size_type
types的确切定义。 不幸的是,这些最大值不同。 实际上, (unsigned long)-1
与(unsigned short)-
(unsigned long)-1
区别在于types的大小不同。 因此,比较
idx == std::string::npos
如果idx的值为-1
,则idx和string::npos
types可能不同:
std::string s; ... int idx = s.find("not found"); // assume it returns npos if (idx == std::string::npos) { // ERROR: comparison might not work ... }
避免这种错误的一种方法是检查search是否直接失败:
if (s.find("hi") == std::string::npos) { ... }
但是,您通常需要匹配字符位置的索引。 因此,另一个简单的解决scheme是为npos定义你自己的签名值:
const int NPOS = -1;
现在比较看起来有点不同,更方便:
if (idx == NPOS) { // works almost always ... }
$21.4 - "static const size_type npos = -1;"
它是由string函数返回指示错误/未find等
npos只是一个标记值,告诉你find()没有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");