【初心者でも安心】C++「Strings」の基礎固め!「std::basic_string::begin」のしくみを徹底解説

2024-06-18

C++の "Strings" における "std::basic_string::begin" の詳細解説

戻り値:

  • std::basic_string::iterator: 非constオブジェクトの場合

解説:

std::basic_string::begin は、文字列の先頭を指すイテレータを返します。このイテレータを使用して、文字列内の個々の文字にアクセスすることができます。例えば、以下のコードは、文字列内の各文字をループで出力します。

#include <iostream>
#include <string>

int main() {
  std::string str = "Hello, World!";

  for (std::string::iterator it = str.begin(); it != str.end(); ++it) {
    std::cout << *it;
  }

  std::cout << std::endl;
  return 0;
}

このコードを実行すると、以下の出力が得られます。

Hello, World!

constバージョン:

std::basic_string::begin には、constバージョンもあります。これは std::basic_string::cbegin と呼ばれ、constオブジェクトに対して使用されます。std::basic_string::cbegin は、constイテレータを返します。constイテレータは、文字列内の文字を読むことはできますが、書き換えることはできません。

例:

以下のコードは、constオブジェクトに対して std::basic_string::cbegin を使用して、文字列の先頭の文字を出力します。

#include <iostream>
#include <string>

int main() {
  const std::string str = "Hello, World!";

  std::string::const_iterator it = str.cbegin();
  std::cout << *it << std::endl;

  return 0;
}
H

注意事項:

  • std::basic_string::begin は、常に有効なイテレータを返します。つまり、空の文字列であっても、先頭の要素を指すイテレータが返されます。
  • std::basic_string::begin を使用して取得したイテレータは、文字列が変更された場合、無効になる可能性があります。文字列を変更する場合は、新しいイテレータを取得する必要があります。

std::basic_string::begin は、C++の "Strings" において、文字列の先頭の要素を指すイテレータを取得するために使用される重要なメンバ関数です。この関数は、文字列内の個々の文字にアクセスしたり、文字列を反復処理したりする際に役立ちます。

補足:

  • std::basic_string::begin と同じ機能を提供するメンバ関数として、std::basic_string::front があります。std::basic_string::front は、文字列の先頭の文字を直接返します。
  • C++20以降では、std::basic_string::starts_with メンバ関数が追加されました。この関数は、文字列が特定のサブストリングで始まるかどうかを判断するために使用できます。


文字列内の各文字をループで処理する:

#include <iostream>
#include <string>

int main() {
  std::string str = "Hello, World!";

  for (std::string::iterator it = str.begin(); it != str.end(); ++it) {
    std::cout << *it;
  }

  std::cout << std::endl;
  return 0;
}
Hello, World!

文字列の先頭の文字を出力する:

#include <iostream>
#include <string>

int main() {
  std::string str = "Hello, World!";

  std::string::iterator it = str.begin();
  std::cout << *it << std::endl;

  return 0;
}
H

文字列内の特定の文字を探す:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
  std::string str = "Hello, World!";
  char target = 'l';

  std::string::iterator it = std::find(str.begin(), str.end(), target);

  if (it != str.end()) {
    std::cout << "文字 '" << target << "' が見つかりました。位置: " << std::distance(str.begin(), it) << std::endl;
  } else {
    std::cout << "文字 '" << target << "' が見つかりませんでした。" << std::endl;
  }

  return 0;
}
文字 'l' が見つかりました。位置: 2

文字列を反復処理して、各文字を大文字に変換する:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
  std::string str = "Hello, World!";

  for (std::string::iterator it = str.begin(); it != str.end(); ++it) {
    *it = std::toupper(*it);
  }

  std::cout << str << std::endl;
  return 0;
}
HELLO, WORLD!

サブストリングが存在するかどうかを確認する:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
  std::string str = "Hello, World!";
  std::string sub = "World";

  std::string::iterator it = std::search(str.begin(), str.end(), sub.begin(), sub.end());

  if (it != str.end()) {
    std::cout << "サブストリング '" << sub << "' が存在します。" << std::endl;
  } else {
    std::cout << "サブストリング '" << sub << "' が存在しません。" << std::endl;
  }

  return 0;
}
サブストリング 'World' が存在します。

これらの例は、std::basic_string::begin を使用して C++ の "Strings" を操作する方法を示すほんの一例です。この関数は、文字列を処理する際に非常に汎用性が高く強力なツールとなります。

ご参考になりましたでしょうか?



"std::basic_string::begin" の代替方法

代替方法の選択肢:

  1. std::basic_string::front は、std::basic_string::begin と同じように、文字列の先頭の要素にアクセスするために使用できます。しかし、std::basic_string::front はイテレータではなく、文字そのものを直接返します。そのため、std::basic_string::front は、文字列の先頭の文字にのみアクセスが必要な場合に適しています。

    #include <iostream>
    #include <string>
    
    int main() {
      std::string str = "Hello, World!";
    
      char first_char = str.front();
      std::cout << "先頭の文字: " << first_char << std::endl;
    
      return 0;
    }
    
    先頭の文字: H
    
  2. レンジベース for ループ:

    C++11 以降では、レンジベース for ループを使用して、"Strings" の各要素を簡単に反復処理することができます。この方法を使用すると、std::basic_string::begin を明示的に呼び出す必要はありません。

    #include <iostream>
    #include <string>
    
    int main() {
      std::string str = "Hello, World!";
    
      for (char c : str) {
        std::cout << c << " ";
      }
    
      std::cout << std::endl;
      return 0;
    }
    
    H e l l o ,  W o r l d !
    
  3. 標準アルゴリズム:

    C++ 標準ライブラリには、"Strings" を操作するための様々なアルゴリズムが用意されています。例えば、std::find アルゴリズムを使用して、文字列内にある特定の文字を探すことができます。これらのアルゴリズムを使用する場合は、std::basic_string::begin を明示的に呼び出す必要はありません。

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    int main() {
      std::string str = "Hello, World!";
      char target = 'l';
    
      std::string::iterator it = std::find(str.begin(), str.end(), target);
    
      if (it != str.end()) {
        std::cout << "文字 '" << target << "' が見つかりました。位置: " << std::distance(str.begin(), it) << std::endl;
      } else {
        std::cout << "文字 '" << target << "' が見つかりませんでした。" << std::endl;
      }
    
      return 0;
    }
    
    文字 'l' が見つかりました。位置: 2
    
  • 文字列の先頭の要素にのみアクセスが必要な場合は、std::basic_string::front を使用するのが最善です。
  • 文字列の各要素を反復処理する場合は、レンジベース for ループを使用するのが最善です。
  • 特定の文字列操作が必要な場合は、標準アルゴリズムを使用するのが最善です。

std::basic_string::begin は、C++ の "Strings" において重要なメンバ関数ですが、状況によっては、代替方法を使用する方が適切な場合があります。上記で紹介した代替方法を理解することで、より柔軟で効率的なコードを書くことができます。