C++で文字列を操る:std::basic_string::back関数の使い方と応用例


使い方

#include <iostream>
#include <string>

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

  // 最後の文字を取得
  char last_char = str.back();
  std::cout << "最後の文字は: " << last_char << std::endl;

  // 最後の文字を変更
  str.back() = '!';
  std::cout << "変更後の文字列: " << str << std::endl;

  return 0;
}

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

最後の文字は: d
変更後の文字列: Hello, World!
  • std::basic_string::back は、参照を返すため、文字列の最後の文字を直接変更することができます。
  • std::basic_string::back は、空文字列に対して呼び出すと未定義の動作になります。必ず空文字列かどうかを確認してから使用してください。
  • rfind(str): 文字列 str が最後に現れる位置を検索します。
  • find(str): 文字列 str が最初に現れる位置を検索します。
  • erase(pos, n): 位置 pos から n 個の文字を削除します。
  • insert(pos, str): 位置 pos に文字列 str を挿入します。
  • append(str): 文字列 str を現在の文字列に追加します。
  • assign(str): 文字列 str を現在の文字列に割り当てます。
  • pop_back(): 最後の文字を文字列から削除します。
  • push_back(c): 文字 c を文字列の最後に追加します。
  • operator[]: n 番目の文字へのアクセスを提供します。
  • at(n): n 番目の文字への参照を取得します。
  • front(): 最初の文字への参照を取得します。


文字列の最後の文字を大文字に変換する

#include <iostream>
#include <string>

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

  // 最後の文字を取得
  char& last_char = str.back();

  // 最後の文字を大文字に変換
  if (std::isalpha(last_char)) {
    last_char = std::toupper(last_char);
  }

  std::cout << "変更後の文字列: " << str << std::endl;

  return 0;
}
変更後の文字列: Hello, World!

末尾の空白文字を削除する

#include <iostream>
#include <string>

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

  // 末尾の空白文字が存在するかどうかを確認
  if (std::isspace(str.back())) {
    // 末尾の文字を削除
    str.pop_back();
  }

  std::cout << "トリミング後の文字列: " << str << std::endl;

  return 0;
}
トリミング後の文字列: Hello, World!
#include <iostream>
#include <string>

int main() {
  std::string str1 = "Hello";
  std::string str2 = ", World";

  // 2 つの文字列を連結
  str1.append(str2);

  // 最後の文字を取得
  char& last_char = str1.back();

  // 最後の文字をドットに変更
  last_char = '.';

  std::cout << "連結後の文字列: " << str1 << std::endl;

  return 0;
}
連結後の文字列: Hello, World.


at() メソッド

at() メソッドは、指定された位置の文字への参照を取得します。文字列の最後の文字にアクセスするには、文字列の長さ - 1 を引数として渡します。

#include <iostream>
#include <string>

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

  // 最後の文字を取得
  char last_char = str.at(str.length() - 1);
  std::cout << "最後の文字は: " << last_char << std::endl;

  // 最後の文字を変更
  str.at(str.length() - 1) = '!';
  std::cout << "変更後の文字列: " << str << std::endl;

  return 0;
}

このコードは、std::basic_string::back と同じように動作します。

イテレータ

std::basic_string オブジェクトは、イテレータを使用して要素を反復処理することができます。最後の文字にアクセスするには、end() イテレータから 1 つ前のイテレータを取得します。

#include <iostream>
#include <string>

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

  // 最後の文字を取得
  auto it = str.end() - 1;
  char last_char = *it;
  std::cout << "最後の文字は: " << last_char << std::endl;

  // 最後の文字を変更
  *it = '!';
  std::cout << "変更後の文字列: " << str << std::endl;

  return 0;
}

このコードは、std::basic_string::backat() メソッドよりも汎用性が高く、文字列の任意の位置にアクセスするために使用できます。

範囲ベース for ループ

範囲ベース for ループを使用して、文字列の各文字を反復処理することができます。最後の文字にアクセスするには、ループの最後のイテレータを取得します。

#include <iostream>
#include <string>

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

  // 最後の文字を取得
  for (char c : str) {
    last_char = c;
  }
  std::cout << "最後の文字は: " << last_char << std::endl;

  // 最後の文字を変更
  for (char& c : str) {
    if (c == str.back()) {
      c = '!';
      break;
    }
  }
  std::cout << "変更後の文字列: " << str << std::endl;

  return 0;
}

このコードは、std::basic_string::backat() メソッドよりも簡潔で、読みやすいコードになります。