このコードでstring :: nposはどういう意味ですか?


91

このフレーズstd::string::nposは、次のコードスニペットで何を意味しますか?

found = str.find(str2);

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

回答:


106

見つからないという意味です。

通常は次のように定義されます。

static const size_t npos = -1;

コードが読みやすいため、-1ではなくnposと比較することをお勧めします。


3
== -1を比較すると、一部の人々はそれを<0に変換できると考えるかもしれませんが、これは同じことではなく、機能しません。
アンディ・デント2012年

ただ、誰もこれに遭遇し、またはそれは私だけ...私が実行されていれば不思議cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;とget pos:4294967295 npos: 4294967295私はWindowsのではなく、Macの私が手でそれを実行したときpos:4294967295 npos: 18446744073709551615。それは正しくないようです... -1代わりに比較することをお勧めしますstd::string::npos
user1135469

@ user1135469 codaddict bellow(stackoverflow.com/a/3827997/752842)またはSebastian Raschka の答えを見つけた場合、私はあなたが得ているものは理にかなっていると思います。また、-1を使用してみたところ、使用している条件下では正しく機能しなかったため、nposの使用をお勧めします。
Dzyann 2013年

51

string::npos-1非位置を表す定数(おそらく)です。findパターンが見つからなかった場合は、メソッドによって返されます。


15
覚えやすくするnpos = no-posの派生を実際に示すための+1 ひとたびそれを知ったらそれについて考えないことは明白ですが、誰かがこれらの文字を初めて見たときは、クリックできないかもしれません...?
Tony Delroy、2010

4
47レベルで間違っています... nposはsize_tであり、負にできないことを意味します...本当の意味はmax_index、64ビットsize_tの場合は18446744073709551615
NoSenseEtAl

25

のドキュメントはstring::npos言う:

nposは、type_t型の要素の最大値を持つ静的メンバー定数値です。

戻り値として、通常は失敗を示すために使用されます。

この定数は実際には-1の値(任意の特性)で定義されています。これは、size_tが符号なし整数型であるため、この型の表現可能な最大値になります。


17

size_tは符号なし変数なので、 'unsigned value =-1'は自動的に最大可能値になりますsize_t:18446744073709551615


size_tは、32ビットコンパイラのunsigned intです。unsigned long long int for 64 bit compiler .. -1に設定すると、そのunsigned型の最大値になります。
sudheerbb

9

std::string::npos常にstd::stringインスタンスの境界外にある実装定義のインデックスです。さまざまなstd::string関数がそれを返したり、受け入れたりして、文字列の状態の終わりを超えて通知します。これは通常、いくつかの符号なし整数型であり、その値は通常std::numeric_limits<std::string::size_type>::max ()(標準の整数昇格のおかげで)通常と同等-1です。


4

string::size_typefind関数の戻り値の型に使用する必要があります。そうしないと、との比較が機能しstring::nposない可能性があります。 size_type文字列のアロケータによって定義されるは、unsigned 整数型でなければなりません。デフォルトのアロケータアロケータはtype size_tasを使用しsize_typeます。-1は符号なし整数型に変換されるため、nposはその型の符号なし最大値です。ただし、正確な値はtypeの正確な定義によって異なり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
...
}

このエラーを回避する1つの方法は、検索が直接失敗するかどうかを確認することです。

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

ただし、多くの場合、一致する文字位置のインデックスが必要です。したがって、別の簡単な解決策は、nposに独自の符号付き値を定義することです。

const int NPOS = -1;

これで、比較は少し異なり、さらに便利に見えます。

if (idx == NPOS) { // works almost always
...
}

3

foundnpos検索文字列で部分文字列が見つからない場合に使用されます。


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

エラー/見つからないなどを示す文字列関数によって返されます。


0

nposは、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");

find()はintを返さないため、このコードは「asad.other」をワートしません。
LogicMagic

0

static const size_t npos = -1;

size_tの最大値

nposは、type_t型の要素の最大値を持つ静的メンバー定数値です。

この値を文字列のメンバー関数のlen(またはsublen)パラメーターの値として使用すると、「文字列の終わりまで」を意味します。

戻り値として、通常、一致しないことを示すために使用されます。

この定数は-1の値で定義されます。これは、size_tが符号なし整数型であるため、この型の表現可能な最大値です。


0

最近の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: " << found.value() << std::endl;
}

0

string :: nposの値は18446744073709551615です。文字列が見つからない場合に返される値です。


実際の値は実装定義であり、無関係です。ただし、実際には、この値18446744073709551615は64ビットの標準値std::size_tであり、最大64ビットの符号なしの値です。
アレックスグテニエフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.