名前空間
変種
操作

std::basic_string<CharT,Traits,Allocator>::find

提供: cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
(1)
size_type find( const basic_string& str, size_type pos = 0 ) const;
(C++11未満)
size_type find( const basic_string& str, size_type pos = 0 ) const noexcept;
(C++11以上)
(C++20未満)
constexpr size_type find( const basic_string& str,
                          size_type pos = 0 ) const noexcept;
(C++20以上)
(2)
size_type find( const CharT* s, size_type pos, size_type count ) const;
(C++20未満)
constexpr size_type find( const CharT* s,
                          size_type pos, size_type count ) const;
(C++20以上)
(3)
size_type find( const CharT* s, size_type pos = 0 ) const;
(C++20未満)
constexpr size_type find( const CharT* s, size_type pos = 0 ) const;
(C++20以上)
(4)
size_type find( CharT ch, size_type pos = 0 ) const;
(C++11未満)
size_type find( CharT ch, size_type pos = 0 ) const noexcept;
(C++11以上)
(C++20未満)
constexpr size_type find( CharT ch, size_type pos = 0 ) const noexcept;
(C++20以上)
(5)
template < class T >
size_type find( const T& t, size_type pos = 0 ) const noexcept(/* see below */);
(C++17以上)
(C++20未満)
template < class T >

constexpr size_type find( const T& t,

                          size_type pos = 0 ) const noexcept(/* see below */);
(C++20以上)

指定された文字シーケンスと等しい最初の部分文字列を探します。 検索は pos から開始されます。 つまり見つかった文字列が pos ��り前の位置で始まることはありません。

1) str と等しい最初の部分文字列を探します。
2) 範囲 [s, s+count) と等しい最初の部分文字列を探します。 範囲はヌル文字を含んでいても構いません。
3) s の指す文字列と等しい最初の部分文字列を探します。 文字列の長さは Traits::length(s) を用いて最初のヌル文字によって決定されます。
4) ch と等しい最初の文字を探します (後述する形式的なルールで単一文字の部分文字列として扱われます)。
5) std::basic_string_view<CharT, Traits> sv = t; によって行われたかのように、 t を文字列ビュー sv に暗黙に変換し、 sv と等しい最初の部分文字列を探します。 このオーバーロードは、std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>true であり、 std::is_convertible_v<const T&, const CharT*>false である場合にのみ、オーバーロード解決に参加します。

形式的には、部分文字列 str は、以下のすべてが真である場合、位置 xpos見つかったと言います。

  • xpos >= pos
  • xpos + str.size() <= size()
  • str 内のすべての位置 n について Traits::eq(at(xpos+n), str.at(n))

特に、これは以下のことを暗に示します。

  • 部分文字列は pos <= size() - str.size() の場合にのみ見つかります。
  • 空の部分文字列は pos <= size() の場合にのみ pos で見つかります。
  • 空でない部分文字列に対して pos >= size() の場合この関数は必ず npos を返します。

目次

[編集] 引数

str - 検索する文字列
pos - 検索を開始する位置
count - 検索する部分文字列の長さ
s - 検索する文字列を指すポインタ
ch - 検索する文字
t - 検索する (std::basic_string_view に変換可能な) オブジェクト

[編集] 戻り値

見つかった部分文字列の最初の文字の位置、またはそのような部分文字列が見つからなければ npos

[編集] 例外

2-3) 何も投げません。
5)
noexcept 指定:  
noexcept(std::is_nothrow_convertible_v<const T&, std::basic_string_view<CharT, Traits>>)

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
LWG 2946 C++17 string_view overload causes ambiguity in some cases avoided by making it a template

[編集]

#include <string>
#include <iostream>
 
void print(std::string::size_type n, std::string const &s)
{
    if (n == std::string::npos) {
        std::cout << "not found\n";
    } else {
        std::cout << "found: " << s.substr(n) << '\n';
    }
}
 
int main()
{
    std::string::size_type n;
    std::string const s = "This is a string";
 
    // search from beginning of string
    n = s.find("is");
    print(n, s);
 
    // search from position 5
    n = s.find("is", 5);
    print(n, s);
 
    // find a single character
    n = s.find('a');
    print(n, s);
 
    // find a single character
    n = s.find('q');
    print(n, s);
}

出力:

found: is is a string
found: is a string
found: a string
not found

[編集] 関連項目

部分文字列が現れる最初の位置を探します
(関数) [edit]
別のワイド文字列中のワイド文字列が現れる最初の位置を探します
(関数) [edit]
文字が現れる最初の位置を探します
(関数) [edit]
ワイド文字列中のワイド文字が現れる最後の位置を探します
(関数) [edit]
部分文字列が現れる最後の位置を探します
(パブリックメンバ関数) [edit]
文字が現れる最初の位置を探します
(パブリックメンバ関数) [edit]
文字が現れない最初の位置を探します
(パブリックメンバ関数) [edit]
文字が現れる最後の位置を探します
(パブリックメンバ関数) [edit]
文字が現れない最後の位置を探します
(パブリックメンバ関数) [edit]
指定範囲の要素に対して検索を行います
(関数テンプレート) [edit]