【问题标题】: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;

【问题讨论】:

    标签: c++ stdstring c++-standard-library


    【解决方案1】:

    表示没有找到。

    通常是这样定义的:

    static const size_t npos = -1;
    

    最好与 npos 进行比较而不是 -1,因为代码更易读。

    【讨论】:

    • 比较 == -1 也可能使一些人认为他们可以将其转换为
    • 只是想知道是否有人遇到过这个问题,还是只有我……我在 Windows 中运行 cout&lt;&lt;"pos: "&lt;&lt;str.find("not in the string")&lt;&lt;" npos: "&lt;&lt;std::string::npos; 并得到 pos:4294967295 npos: 4294967295,但在 Mac 上运行时得到 pos:4294967295 npos: 18446744073709551615。这似乎不对......好吧,我建议以任何方式与-1而不是std::string::npos进行比较
    • @user1135469 如果您看到 codaddict bellow (stackoverflow.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&lt;std::string::size_type&gt;::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&lt;std::string::size_type&gt;(它应该...) - 那么条件变成:

              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 npos{static_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
                  

                  【讨论】:

                    猜你喜欢
                    • 2011-07-03
                    • 1970-01-01
                    • 2016-03-28
                    • 1970-01-01
                    相关资源
                    最近更新 更多