C++でstd::stringから空白を削除する方法
この記事では、C++でstd::stringから空白(スペース)を取り除く方法を解説します。空白の削除には、<algorithm>ヘッダーで提供されるremove()関数を使用します。この関数は、処理対象の範囲の先頭と末尾を指す2つのイテレータと、削除したい値を第3引数として受け取ります。
入力:文字列 "This is C++ Programming Language" 出力:文字列 "ThisisC++ProgrammingLanguage"
アルゴリズム
ステップ1:文字列を取得する ステップ2:remove()関数を使って、与えられた文字列から空白を削除する ステップ3:結果の文字列を返す
サンプルコード
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
string my_str = "This is C++ Programming Language";
cout << "空白を含む文字列 : " << my_str << endl;
// erase–remove イディオムで空白を完全に削除
my_str.erase(remove(my_str.begin(), my_str.end(), ' '), my_str.end());
cout << "空白を除去した文字列 : " << my_str << endl;
}実行結果
空白を含む文字列 : This is C++ Programming Language 空白を除去した文字列 : ThisisC++ProgrammingLanguage
ポイント:erase–remove イディオムについて
std::remove()は、要素をコンテナから物理的に取り除く関数ではない点に注意が必要です。実際には、削除対象以外の要素を前方へ移動させ、新しい論理的な終端を指すイテレータを返すだけです。そのため、remove()だけを呼び出しても文字列のサイズは変わらず、末尾に不要な文字が残ってしまいます。
そこで、remove()の戻り値をerase()に渡し、新しい終端以降の要素を一括で削除する「erase–remove イディオム」を使うのがC++における定番の手法です。上記のサンプルコードでもこの方法を採用しています。
応用:すべての空白文字を削除する
半角スペースに加えて、タブや改行などの空白文字もまとめて削除したい場合は、remove_if()とisspace()を組み合わせます。さらにC++20以降では、std::erase_if()を使うことでより簡潔に記述できます。
#include<cctype>
// C++20以降なら1行でOK
std::erase_if(my_str, [](unsigned char c) { return std::isspace(c); });
// C++17以前の場合
my_str.erase(std::remove_if(my_str.begin(), my_str.end(),
[](unsigned char c) { return std::isspace(c); }), my_str.end());-
C++で文字列から二分木を構築する方法
括弧と整数から構成される文字列が与えられたとき、その文字列から二分木を構築する問題を考えてみましょう。入力文字列全体が一つの二分木を表しており、整数の後に0個、1個、または2組の括弧が続く形式になっています。整数はルート(根)ノードの値を表し、各括弧のペアは同じ構造を持つ子の部分木を含んでいます。問題の例例えば、入力が 4(2(3)(1))(6(5)) のような文字列だった場合、出力は [3,2,1,4,5,6](中順走査・inorder traversal の結果)となります。解決アプローチこの問題を解くために、以下の手順に従います。再帰関数 solve() を定義します。引数として文字列
-
C#で文字列から先頭のゼロを削除する方法
文字列の先頭に余分なゼロが付いていると、数値として扱う際やデータの整形時に不便なことがあります。例えば、次のような先頭にゼロが付いた文字列を考えてみましょう。 String str = 000234; このような先頭ゼロを削除するには、C#のTrimStart()メソッドを使用します。引数として、削除したい文字(ここでは「0」)をChar型の配列で指定します。 TrimStart(new Char[] { 0 } ) TrimStart()メソッドは、指定した文字が続く限り、文字列の先頭から順番に削除していきます。そのため、「000234」のように複数のゼロが連続していても、すべての先頭ゼロ