HOWTO · C++

C++ で文字列を逆にする方法

この記事では、C++ で文字列を反転させる方法を紹介します。

この記事では、C++ で文字列を逆引きする方法を説明します。

文字列コンストラクタを使用して文字列を反転する

std::basic_string にはコンストラクタがあり、そのコンストラクタは範囲の内容を含む文字列を作成することができます。そして、新しい文字列変数を宣言し、そのコンストラクタに元の文字列変数 tmp_s の逆イテレータを与えることができます。次の例は、このメソッドを実演し、検証のために両方の文字列を出力します。

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

using std::cout;
using std::endl;
using std::reverse;
using std::string;

int main() {
  string tmp_s = "This string will be reversed";
  cout << tmp_s << endl;

  string tmp_s_reversed(tmp_s.rbegin(), tmp_s.rend());
  cout << tmp_s_reversed << endl;

  return EXIT_SUCCESS;
}

出力:

This string will be reversed
desrever eb lliw gnirts sihT

文字列の逆引きに std::reverse() を用いるアルゴリズム

STL ライブラリの <algorithm> にある std::reverse メソッドは、範囲内の要素の順序を反転させます。このメソッドは引数として渡されたオブジェクトを操作し、データの新しいコピーを返さないので、元の文字列を保持するために別の変数を宣言する必要があります。

関数 reverse はアルゴリズムがメモリの確保に失敗した場合に std::bad_alloc 例外をスローすることに注意してください。

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

using std::cin;
using std::cout;
using std::endl;
using std::reverse;
using std::string;

int main() {
  string tmp_s = "This string will be reversed";
  cout << tmp_s << endl;

  string tmp_s_reversed(tmp_s);
  reverse(tmp_s_reversed.begin(), tmp_s_reversed.end());
  cout << tmp_s_reversed << endl;

  return EXIT_SUCCESS;
}

文字列の逆引きに std::copy() アルゴリズムを用いる

std::copy もまた強力なアルゴリズムであり、複数のシナリオで利用することができます。この解決策では、新しい文字列変数を初期化し、組み込みの resize メソッドを用いてそのサイズを変更します。次に、copy メソッドを呼び出して宣言された文字列を元の文字列のデータで埋めます。ただし、最初の 2つのパラメータはソース範囲の逆イテレータでなければならないことに注意してください。

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

using std::cin;
using std::cout;
using std::endl;
using std::reverse;
using std::string;

int main() {
  string tmp_s = "This string will be reversed";
  cout << tmp_s << endl;

  string tmp_s_reversed;
  tmp_s_reversed.resize(tmp_s.size());
  copy(tmp_s.rbegin(), tmp_s.rend(), tmp_s_reversed.begin());
  cout << tmp_s_reversed << endl;

  return EXIT_SUCCESS;
}

逆引きした文字列データを保存する必要がない場合は、copy() アルゴリズムを用いて、以下のコードサンプルに示すように、文字列データを逆順に直接コンソールに出力することができます。

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

using std::cin;
using std::cout;
using std::endl;
using std::reverse;
using std::string;

int main() {
  string tmp_s = "This string will be reversed";
  cout << tmp_s << endl;

  copy(tmp_s.rbegin(), tmp_s.rend(), std::ostream_iterator<char>(cout, ""));

  return EXIT_SUCCESS;
}