size_type
find_first_of(const basic_string& str,
size_type pos = 0) const; // (1) C++03
size_type
find_first_of(const basic_string& str,
size_type pos = 0) const noexcept; // (1) C++11
constexpr size_type
find_first_of(const basic_string& str,
size_type pos = 0) const noexcept; // (1) C++20
size_type
find_first_of(const charT* s,
size_type pos, size_type n) const; // (2) C++03
constexpr size_type
find_first_of(const charT* s,
size_type pos, size_type n) const; // (2) C++20
size_type
find_first_of(const charT* s,
size_type pos = 0) const; // (3) C++03
constexpr size_type
find_first_of(const charT* s,
size_type pos = 0) const; // (3) C++20
size_type
find_first_of(charT c,
size_type pos = 0) const; // (4) C++03
constexpr size_type
find_first_of(charT c,
size_type pos = 0) const; // (4) C++20
// string_viewを引数に取るオーバーロード
template <class T>
size_type
find_first_of(const T& t,
size_type pos = 0) const noexcept(下記参照); // (5) C++17
template <class T>
constexpr size_type
find_first_of(const T& t,
size_type pos = 0) const noexcept(下記参照); // (5) C++20
概要
指定された文字列中のいずれかの文字が出現する最初の場所を検索する。
テンプレートパラメータ制約
- (5) :
is_convertible_v<const T&, basic_string_view<charT, traits>>
がtrue
であることis_convertible_v<const T&, const charT*>
がfalse
であること
要件
(3) の形式の場合、s
は少なくとも traits_type::length(s) + 1
の要素を持つ charT
の配列を指していること。
効果
- (1)
pos
以降で最初にstr
内に存在する文字の位置を返す。 - (2)
pos
以降で最初にs
内に存在する文字の位置を返す。s
は長さn
の文字列へのポインタである。 - (3) (2) と同様だが、こちらは NULL 終端の文字列を扱う。
- (4)
pos
以降で最初にc
と一致する文字の位置を返す。 - (5)
basic_string_view<charT, traits> sv = t;
として変数sv
を作成し、pos
以降で最初にsv
内に存在する文字の位置を返す。
戻り値
見つかればその位置を返し、見つからない場合は basic_string::npos
を返す。
例外
- (1) 投げない
- (5)
noexcept
内の式は、以下と等価である
is_nothrow_convertible_v<const T&, basic_string_view<charT, traits>>
備考
- 一致する文字の検索は、指定された文字列の各文字について
traits_type::eq
を使用することで行われる。
例えば、(1) の形式の場合、以下のような条件を満たす最小のxpos
を求める。pos <= xpos
かつxpos < size()
0 <= I
かつI < str.size()
を満たすいずれかのI
について、traits_type::eq(at(xpos), str.at(I))
- (3) の形式の場合、
s
の文字列長はtraits_type::length(s)
で求められる。
例
#include <iostream>
#include <string>
int main()
{
const std::string s("Hello, world. Welcome to C++ world.");
const std::string str("world");
// "Welcome" 以降で "world" を検索すると、"Welcome" の 3 文字目の "l" が見つかる
std::cout << s.find_first_of(str, 14) << std::endl;
// "Welcome" 以降で ",.+" を検索すると、"C++" の 1 文字目の "+" が見つかる
std::cout << s.find_first_of(",.+", 14) << std::endl;
// basic_string は NULL 終端されていないので、'\0' を検索しても見つからない
std::cout << std::boolalpha << (s.find_first_of('\0') == std::string::npos) << std::endl;
}
出力
16
26
true
実装例
(1) 以外の形式は、(1) の形式を使用して実装することができる。
// (2)
template <class charT, class traits, class Allocator>
size_type basic_string<charT, traits, Allocator>::find_first_of(const charT* s, size_type pos, size_type n) const
{
return find_first_of(std::basic_string(s, n), pos);
}
// (3)
template <class charT, class traits, class Allocator>
size_type basic_string<charT, traits, Allocator>::find_first_of(const charT* s, size_type pos = 0) const
{
return find_first_of(std::basic_string(s), pos);
}
// (4)
template <class charT, class traits, class Allocator>
size_type basic_string<charT, traits, Allocator>::find_first_of(charT c, size_type pos = 0) const
{
return find_first_of(std::basic_string(1, c), pos);
}
関連項目
名前 | 説明 |
---|---|
find_first_of |
ある集合の1つとマッチする最初の要素を検索する |
参照
- LWG2064 - More
noexcept
issues inbasic_string
- P0254R2 Integrating
std::string_view
andstd::string
- LWG Issue 2946. LWG 2758's resolution missed further corrections
- 意図しない暗黙変換防止のために
string_view
を受けるオーバーロード(5)の引数型をconst T&
に変更
- 意図しない暗黙変換防止のために
- P0980R1 Making
std::string
constexpr