C/C++で文字列内の単語を反復処理する最もエレガントな方法
C/C++の文字列に含まれる単語を反復処理する「唯一のエレガントな方法」は存在しません。可読性の高さをエレガントと評価する人もいれば、実行パフォーマンスの高さこそがエレガントだと考える人もいます。ここでは、文字列を単語ごとに分割しながら反復処理するための代表的な2つの方法を、コード例とともに紹介します。
方法1:stringstreamで空白区切りの単語を読み取る
最初の方法は、std::stringstreamを使用して、スペースで区切られた単語を順番に抽出するアプローチです。柔軟性にはやや欠けますが、適切なチェックを組み合わせれば、ほとんどの場面で十分に実用的です。
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main() {
string str("Hello from the dark side");
string tmp; // 各反復で単語を格納する文字列
stringstream str_strm(str);
vector<string> words; // 単語を保持するベクターを作成
while (str_strm >> tmp) {
// tmpが空でないかなどのチェックを行う
// 記号(! や . や ? など)を取り除く処理もここで行う
// 最後にベクターへ追加する
words.push_back(tmp);
}
}この方法では、抽出演算子 >> が自動的に空白(スペース・タブ・改行)をスキップしてくれるため、連続した空白が含まれていても正しく単語を分割できるのが利点です。
方法2:getline関数で任意の区切り文字を指定する
もう1つの方法は、std::getline関数に独自の区切り文字(デリミタ)を渡して文字列を分割するものです。カンマなど、空白以外の区切り文字にも対応できる点が大きなメリットです。
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main() {
std::stringstream str_strm("Hello from the dark side");
std::string tmp;
vector<string> words;
char delim = ' '; // 分割に使用する区切り文字を定義
while (std::getline(str_strm, tmp, delim)) {
// tmpが空でないかなどのチェックを行う
// 記号(! や . や ? など)を取り除く処理もここで行う
// 最後にベクターへ追加する
words.push_back(tmp);
}
}どちらの方法でも、ループ内で空文字列のチェックや記号の除去といった前処理を加えることで、より堅牢な実装になります。さらに複雑なトークン化が必要なケースでは、std::regexやBoost.Tokenizerなどの活用も検討するとよいでしょう。
-
Windowsで使えるC++開発向けおすすめIDE 7選
```html 大規模なプロジェクトをプレーンなテキストエディターだけで管理するのは困難です。こうしたケースではIDE(統合開発環境)を使った方が、生産性が向上しストレスも大幅に軽減されます。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。ここでは、Windowsで利用できる優れたC/C++向けIDEをご紹介します。 1. Visual Studio Microsoftが開発した定番IDEです。Windows上でのC++プログラムの構築・開発・プロファイリングにおいて、最高クラスのツール群を備えています。豊富なプラグインストアも魅力で、Azure、PowerShe
-
Pythonで文字列が空かどうかを確認する最も洗練された方法とは?
Pythonで文字列が空かどうかを判定する最もシンプルで「Pythonic」な方法は、not 演算子を使うことです。Pythonでは空の文字列は「falsy(偽値)」として扱われ、ブール値のコンテキストでは False と評価されます。そのため、if not string: という条件式だけで空文字列のチェックが可能です。 基本的な使い方 string = if not string: print(Empty String!) 出力 Empty String! このコードを実行すると、変数 string が空であるため、「Empty String!」が出力されます。 空白文字を含む場