最終更新日時(UTC):
が更新

履歴 編集

function
<string_view>

std::basic_string_view::find_last_not_of(C++17)

constexpr size_type find_last_not_of(basic_string_view sv,
                                     size_type pos = npos) const noexcept; // (1)
constexpr size_type find_last_not_of(CharT c,
                                     size_type pos = npos) const noexcept; // (2)
constexpr size_type find_last_not_of(const CharT* s,
                                     size_type pos,
                                     size_type n) const;                   // (3)
constexpr size_type find_last_not_of(const CharT* s,
                                     size_type pos = npos) const;          // (4)

概要

指定された文字列中のいずれかの文字にも一致しない最後の場所を検索する。

  • (1) : 指定した位置posより前で、文字列sv内のいずれかの文字にも一致しない最後の位置を検索する
  • (2) : 指定した位置posより前で、文字cに一致しない最後の位置を検索する
  • (3) : 指定した位置posより前で、文字列sの先頭n文字のいずれかの文字にも一致しない最後の位置を検索する
  • (4) : 指定した位置posより前で、文字列s内のいずれかの文字にも一致しない最後の位置を検索する

戻り値

  • (1) : 一致しない文字が見つかればその位置を返し、見つからない場合は basic_string_view::npos を返す。
  • (2) : return find_last_not_of(basic_string_view(&c, 1), pos);
  • (3) : return find_last_not_of(basic_string_view(s, n), pos);
  • (4) : return find_last_not_of(basic_string_view(s), pos);

例外

  • (1), (2) : 投げない

備考

  • 文字列の一致は、文字列の各文字について traits_type::eq() を用いて検査される。
    例えば、(1) の形式の場合、以下のような条件を満たす最大の xpos を求める。
    • xpos <= pos かつ xpos + sv.size() <= size()
    • 0 <= I かつ I < sv.size() を満たす全ての I について、traits_type::eq(at(xpos + I), sv.at(I))
  • (4) の形式の場合、s の文字列長は traits_type::length(s) で求められる。

#include <iostream>
#include <string_view>

int main()
{
  const std::string_view sv = "Hello, world. Welcome to C++ world.";

  // (1)
  // 1 つめの "world" の "d" より前で "world" を検索すると、最初の空白が見つかる
  {
    const std::string_view target = "world";
    std::size_t pos = sv.find_last_not_of(target, 11);
    if (pos != std::string_view::npos) {
      std::cout << "(1) : " << pos << " [" << sv.substr(pos) << ']' << std::endl;
    }
  }

  // (2)
  // "C++" の 2 つめの "+" より前で '+' を検索すると "C" が見つかる
  {
    std::size_t pos = sv.find_last_not_of('+', 27);
    if (pos != std::string_view::npos) {
      std::cout << "(2) : " << pos << " [" << sv.substr(pos) << ']' << std::endl;
    }
  }

  // (3)
  // "Welcome to C++ world." を検索すると、"," が見つかる
  {
    std::size_t pos = sv.find_last_not_of("Welcome to C++ world.");
    if (pos != std::string_view::npos) {
      std::cout << "(3) : " << pos << " [" << sv.substr(pos) << ']' << std::endl;
    }
  }
}

出力

(1) : 6 [ world. Welcome to C++ world.]
(2) : 25 [C++ world.]
(3) : 5 [, world. Welcome to C++ world.]

バージョン

言語

  • C++17

処理系