std::basic_string<CharT,Traits,Allocator>::rfind
From cppreference.com
< cpp | string | basic string
size_type rfind( const basic_string& str, size_type pos = npos ) const; |
(1) | (C++11 以降 noexcept) (C++20 以降 constexpr) |
size_type rfind( const CharT* s, size_type pos, size_type count ) const; |
(2) | (C++20 以降 constexpr) |
size_type rfind( const CharT* s, size_type pos = npos ) const; |
(3) | (C++20 以降 constexpr) |
size_type rfind( CharT ch, size_type pos = npos ) const; |
(4) | (C++11 以降 noexcept) (C++20 以降 constexpr) |
template< class StringViewLike > size_type rfind( const StringViewLike& t, |
(5) | (C++17以降) (C++20 以降 constexpr) |
指定された文字シーケンスと等しい最後の部分文字列を検索します。posから検索を開始し、右から左へと進行します(したがって、見つかった部分文字列はposより後の位置で始まることはありません)。nposまたはsize() - 1より小さい値でない値がposとして渡された場合、文字列全体が検索されます。
1) strと等しい最後の部分文字列を検索します。
2) 範囲
[s, s + count)と等しい最後の部分文字列を検索します。この範囲にはヌル文字を含めることができます。 範囲
[s, s + count)が有効な範囲でない場合、動作は未定義です。3) sが指すC文字列と等しい最後の部分文字列を検索します。文字列の長さは、最初のヌル文字によってTraits::length(s)を使用して決定されます。
範囲
[s, s + Traits::length(s))が有効な範囲でない場合、動作は未定義です。4) chと等しい最後の文字を検索します。
このオーバーロードは、std::is_convertible_v<const StringViewLike&,
std::basic_string_view<CharT, Traits>>がtrueであり、かつstd::is_convertible_v<const StringViewLike&, const CharT*>がfalseである場合にのみ、オーバーロード解決に参加します。
std::basic_string_view<CharT, Traits>>がtrueであり、かつstd::is_convertible_v<const StringViewLike&, const CharT*>がfalseである場合にのみ、オーバーロード解決に参加します。
すべての場合において、等価性はTraits::eqを呼び出すことによってチェックされます。
目次 |
[編集] パラメータ
| str | - | 検索する文字列 |
| pos | - | 検索を開始する位置 |
| count | - | 検索する部分文字列の長さ |
| s | - | 検索するC文字列へのポインタ |
| 文字 | - | 検索する文字 |
| t | - | std::basic_string_viewに変換可能なオブジェクト |
[編集] 戻り値
見つかった部分文字列の最初の文字の位置。そのような部分文字列が見つからない場合はnpos。これは文字列の末尾からのオフセットではなく、先頭からのオフセットであることに注意してください。
空の文字列を検索する場合(つまり、str.size()、count、またはTraits::length(s)がゼロの場合)、空の文字列は即座に見つかり、rfindは以下を返します。
- pos(pos < size()の場合);
- size()(それ以外の場合。 pos == nposの場合も含む)。
それ以外の場合、size()がゼロの場合、常にnposが返されます。
[編集] 例外
1,4) 何も投げません。
5)
noexcept 指定:
noexcept(std::is_nothrow_convertible_v<const T&, std::basic_string_view<CharT, Traits>>)
何らかの理由で例外がスローされた場合、この関数は効果がありません(強力な例外安全保証)。
[編集] 例
このコードを実行
#include <iomanip> #include <iostream> #include <string> void print(std::string::size_type n, std::string::size_type len, std::string const &s) { if (n == std::string::npos) std::cout << "not found\n"; else std::cout << "found: " << std::quoted(s.substr(n, len)) << " at " << n << '\n'; } int main() { std::string::size_type n; std::string const s = "This is a string"; // search backwards from end of string n = s.rfind("is"); print(n, 2, s); // search backwards from position 4 n = s.rfind("is", 4); print(n, 2, s); // find a single character n = s.rfind('s'); print(n, 1, s); // find a single character n = s.rfind('q'); print(n, 1, s); // find the prefix (see also s.starts_with("This")) n = s.rfind("This", 0); print(n, 4, s); }
出力
found: "is" at 5 found: "is" at 2 found: "s" at 10 not found found: "This" at 0
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 847 | C++98 | 例外安全性保証がなかった | 強力な例外安全性保証を追加 |
| LWG 2064 | C++11 | (3,4) のオーバーロードは noexcept でした。 | 削除 |
| LWG 2946 | C++17 | (5) のオーバーロードは、一部のケースで曖昧さを引き起こしました。 | テンプレートにすることで回避されました。 |
| P1148R0 | C++11 C++17 |
(4,5) のオーバーロードの noexcept は LWG2064/LWG2946 によって誤って削除されました。 |
復元されました。 |
[編集] 関連項目
| 指定された部分文字列が最初に現れる位置を見つける (public member function) | |
| 文字が最初に現れる位置を見つける (public member function) | |
| 文字が最初に現れない位置を見つける (public member function) | |
| 文字が最後に現れる位置を見つける (public member function) | |
| 文字が最後に現れない位置を見つける (public member function) | |
| 部分文字列が最後に現れる位置を見つける ( std::basic_string_view<CharT,Traits>のパブリックメンバ関数) |