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::back
や at()
メソッドよりも汎用性が高く、文字列の任意の位置にアクセスするために使用できます。
範囲ベース 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::back
や at()
メソッドよりも簡潔で、読みやすいコードになります。