What does string::npos mean in this code?

后端 未结 12 1174
傲寒
傲寒 2020-11-30 18:50

What does the phrase std::string::npos mean in the following snippet of code?

found = str.find(str2);

if (found != std::string::npos)
    std::         


        
相关标签:
12条回答
  • 2020-11-30 19:20

    found will be npos in case of failure to find the substring in the search string.

    0 讨论(0)
  • 2020-11-30 19:21

    It means not found.

    It is usually defined like so:

    static const size_t npos = -1;
    

    It is better to compare to npos instead of -1 because the code is more legible.

    0 讨论(0)
  • 2020-11-30 19:24

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

    0 讨论(0)
  • 2020-11-30 19:26

    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, which is defined by the allocator of the string, must be an unsigned integral type. The default allocator, allocator, uses type size_t as size_type. Because -1 is converted into an unsigned integral type, npos is the maximum unsigned value of its type. However, the exact value depends on the exact definition of type size_type. Unfortunately, these maximum values differ. In fact, (unsigned long)-1 differs from (unsigned short)-1 if the size of the types differs. Thus, the comparison

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

    One way to avoid this error is to check whether the search fails directly:

    if (s.find("hi") == std::string::npos) {
    ...
    }
    

    However, often you need the index of the matching character position. Thus, another simple solution is to define your own signed value for npos:

    const int NPOS = -1;
    

    Now the comparison looks a bit different and even more convenient:

    if (idx == NPOS) { // works almost always
    ...
    }
    
    0 讨论(0)
  • 2020-11-30 19:30
    $21.4 - "static const size_type npos = -1;"
    

    It is returned by string functions indicating error/not found etc.

    0 讨论(0)
  • 2020-11-30 19:31

    The document for string::npos says:

    npos is a static member constant value with the greatest possible value for an element of type size_t.

    As a return value it is usually used to indicate failure.

    This constant is actually defined with a value of -1 (for any trait), which because size_t is an unsigned integral type, becomes the largest possible representable value for this type.

    0 讨论(0)
提交回复
热议问题