std::string::npos
次のコード スニペットのフレーズは何を意味していますか?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
std::string::npos
次のコード スニペットのフレーズは何を意味していますか?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
見つからないという意味です。
通常は次のように定義されます。
static const size_t npos = -1;
コードがより読みやすいため、-1 ではなく npos と比較することをお勧めします。
string::npos
-1
非位置を表す定数 (おそらく) です。find
パターンが見つからなかった場合にメソッドによって返されます。
のドキュメントにstring::npos
は次のように記載されています。
npos は、size_t 型の要素の可能な最大値を持つ静的メンバー定数値です。
戻り値として、通常は失敗を示すために使用されます。
この定数は、実際には値 -1 で定義されます (任意のトレイトに対して)。これは、size_t が符号なし整数型であるため、この型で表現可能な最大値になります。
size_t
は符号なし変数であるため、「符号なし値 = - 1」は自動的に の可能な最大値になりますsize_t
: 18446744073709551615
std::string::npos
常にstd::string
インスタンスの範囲外にある実装定義のインデックスです。さまざまなstd::string
関数がそれを返したり受け入れたりして、文字列の終了状況を通知します。これは通常、何らかの符号なし整数型であり、その値は通常std::numeric_limits<std::string::size_type>::max ()
(標準の整数昇格のおかげで) に匹敵し-1
ます。
find 関数の戻り値の型に使用する必要があります。string::size_type
そうしないと、 との比較が機能しstring::npos
ない可能性があります。
size_type
文字列のアロケータによって定義される は、unsigned
整数型でなければなりません。デフォルトのアロケータである allocator は、type size_t
asを使用しsize_type
ます。-1
は符号なし整数型に変換されるため、npos はその型の符号なし最大値です。ただし、正確な値は type の正確な定義によって異なりますsize_type
。残念ながら、これらの最大値は異なります。実際には、型のサイズが(unsigned long)-1
異なると1 とは異なります。(unsigned short)-
したがって、比較
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
...
}
found
npos
検索文字列で部分文字列が見つからなかった場合に使用されます。
$21.4 - "static const size_type npos = -1;"
エラー/見つからないなどを示す文字列関数によって返されます。