-
C++ STLのnegate関数で値の符号を反転する方法
C++のSTL(標準テンプレートライブラリ)には、値の符号を簡単に反転できるnegate関数が用意されています。negateは「否定する」という意味を持つ関数オブジェクトで、正の値を負の値へ、負の値を正の値へと変換します。この記事では、std::transformと組み合わせてnegateを使う方法を解説します。関数プロトタイプnegateは通常、transformアルゴリズムと一緒に使われます。基本的な構文は以下の通りです。function transform(a_begin, a_end, a1_begin, negate()): a_begin = 配列の先頭(
-
C++でベクトル(vector)を使って文字列照合を実装する方法
文字列照合にはさまざまな手法がありますが、本記事ではベクトル(std::vector)を活用した文字列検索の実装方法を解説します。このアプローチでは、検索対象のメイン文字列と、探したいパターン文字列をどちらもベクトルとして扱い、その中から一致する部分を見つけ出します。 C++では、標準ライブラリを利用することでベクトルを簡単に作成・操作できます。まずメイン文字列と検索用のパターン文字列をそれぞれベクトルに格納し、メイン文字列の中からパターンを検索します。一致が見つかると、関数はその位置を返すとともに、処理済みの部分をメイン文字列から削除します。そのため、次の検索では常に残りの文字列に対して処
-
C++におけるstring型とchar[]型の違いを徹底解説
C++で文字列を扱う方法としては、主に2つの選択肢があります。従来のC言語スタイルのchar配列(char[])と、標準ライブラリが提供するstd::stringクラスです。この記事では、両者の違いとそれぞれの特徴について詳しく解説します。 char[]の特性と注意点 char[]は基本的に文字を順番に並べた単純な配列であり、以下のような性質を持っています。 固定サイズのメモリ消費char[]をスタック領域に確保した場合、格納するテキストの長さに関係なく、常に256バイト程度の領域を占有します。 手動でのメモリ管理が必要malloc()やcalloc()を使ってヒープ領域に動的にメモリを確保
-
C++の文字列比較:== 演算子と compare() の違いとは?
はじめにC++では、== 演算子と compare() 関数という2つの方法で文字列を比較できます。「なぜ2つの方法が存在するのか?」「何か違いがあるのか?」と疑問に思う方も多いでしょう。結論から言うと、この2つには明確な役割の違いがあります。それぞれの特徴を詳しく見ていきましょう。== 演算子の特徴:等しいかどうかの判定C++では、std::string クラスに対して == 演算子がオーバーロードされています。そのため、2つの文字列が完全に一致しているかどうかを直感的にチェックできます。両者の文字列が一致する場合:true(出力上は 1)を返す一致しない場合:false(出力上は 0)を返
-
C++でstd::stringをconst char*やchar*に変換する方法
この記事では、C++のstd::stringをconst char*またはchar*に変換する方法を解説します。これらは「Cスタイル文字列」と呼ばれる形式で、C言語由来のAPIやライブラリと連携する際によく必要になります。変換にはc_str()というメンバ関数を使用します。この関数は、文字列オブジェクトの現在の値を表す、ヌル終端(null-terminated)された文字配列へのポインタを返します。std::string::c_str() の宣言std::string::c_strの宣言は以下の通りです。const char* c_str() const;この関数は、文字列オブジェクトの現在の
-
C++で列挙型(enum)を文字列に変換する方法をわかりやすく解説
この記事では、C++において列挙型(enum)のデータを文字列へ変換する方法を詳しく解説します。C++の標準ライブラリには、enumを直接文字列に変換する機能は用意されていません。しかし、独自の関数を作成することで、簡単にこの変換を実現できます。具体的なアプローチとしては、enum値を引数として受け取る関数を定義し、その中でswitch文を使って各enum値に対応する名前を文字列として手動で返すという方法が一般的です。サンプルコード#include <iostream> using namespace std; enum Animal {Tiger, Elephant, Bat,
-
【C++入門】std::stringをすべて小文字に変換する方法
この記事では、C++の文字列(std::string)に含まれるすべての英字を小文字に変換する方法を解説します。この処理を実現するには、<algorithm> ヘッダーで提供されている transform 関数を使用します。 transform関数による小文字変換の仕組み transform 関数には、主に次の4つの引数を渡します。 変換対象の文字列の先頭イテレータ(begin()) 変換対象の文字列の末尾イテレータ(end()) 変換結果を格納する出力先の先頭イテレータ 各文字に適用する関数(ここでは ::tolower) 第4引数に ::tolower を指定すると、範囲内
-
C++の列挙型を文字列に変換する方法を解説
C++では、列挙型の値をそのまま出力すると、名前ではなく整数値が表示されます。本記事では、列挙型を対応する文字列に変換して表示する方法を詳しく解説します。列挙型から文字列への変換が必要な理由残念ながら、C++標準ライブラリには列挙型を文字列に直接変換する組み込み関数は用意されていません。そのため、自分で変換関数を作成する必要があります。最もシンプルで一般的なアプローチは、列挙型の値を引数として受け取り、switch文を使って対応する文字列を返す関数を定義することです。実装例:switch文を使った変換関数以下のコードでは、動物を表す列挙型 Animal を定義し、それを文字列に変換する関数 e
-
C++で文字列を高速に逆順にする方法|reverse()関数の使い方を解説
この記事では、C++を使って文字列を非常に高速に逆順(反転)にする方法を解説します。文字列の反転には、algorithmライブラリに用意されている組み込み関数 reverse() を利用できます。この関数は、コンテナの先頭と末尾を指すイテレータを引数として受け取り、その範囲内の要素を反転させます。 入力:文字列 Hello World 出力:dlroW olleH アルゴリズム ステップ1:文字列を用意する ステップ2:reverse() 関数を使って文字列を反転する ステップ3:結果を出力する ステップ4:終了 サンプルコード #include<iostream> #i
-
【C++】文字列から特定の文字を削除する方法(erase・remove活用)
この記事では、C++で文字列から特定の文字を削除する方法を解説します。C++では、標準ライブラリの erase() 関数と remove() 関数を組み合わせることで、この処理を非常に簡単に実装できます。remove() 関数は、文字列の先頭と末尾を指すイテレータ、および削除したい文字を引数として受け取ります。ただし、remove() 単体では要素が実際に削除されるわけではなく、削除対象以外の文字を前方へ移動させるだけです。そのため、文字列から完全に取り除くには、erase() と組み合わせる「erase-remove イディオム」を使うのが定番の手法です。入力:文字列 ABAABACCABA
-
C++の文字列at()関数とは?使い方とサンプルコードを解説
この記事では、C++におけるat()関数の概要と基本的な使い方について解説します。at()関数とはat()関数は、C++のstd::stringクラスが提供するメンバ関数の一つで、指定した位置(インデックス)にある文字にアクセスするために使用されます。[]演算子でも同様に文字へアクセスできますが、at()関数は範囲外のインデックスを指定した場合にout_of_range例外をスローするため、より安全に扱えるという特徴があります。サンプルコード次のプログラムでは、at()関数を使って文字列内の各文字を先頭から順に取り出し、1行ずつ出力しています。#include<iostream>
-
C++で文字列内の単語を反復処理する最もエレガントな方法
文字列の単語を反復処理するには C/C++の文字列に含まれる単語を反復処理する「唯一のエレガントな方法」は存在しません。可読性の高さを重視して最もエレガントと考える人もいれば、パフォーマンスの高さこそがエレガントだと考える人もいます。ここでは、このタスクを実現するための方法として、stringstreamを使ってスペースで区切られた単語を読み取る手法を紹介します。この方法はやや制限がありますが、適切なチェックを組み合わせれば十分に目的を果たせます。 サンプルコード #include <iostream> #include <vector> #include <s
-
C++で文字列をトークン化する方法:stringstreamとgetline()による分割テクニック
この記事では、C++における文字列のトークン化(分割)の方法について解説します。C言語では、文字配列に対してstrtok()関数を使用することで文字列を分割できましたが、C++ではstd::stringクラスを扱うため、少し異なるアプローチが必要です。C++の機能を活用して文字列を分割するには、まずstd::stringをstringstream(文字列ストリーム)に変換します。その後、getline()関数を使うことで、指定した区切り文字(デリミタ)ごとに文字列を切り出すことができます。getline()関数は、以下の3つの引数を受け取ります。入力元となる文字列ストリーム出力結果を格納する文
-
C++でintをstring(文字列)に変換する最も簡単な方法
この記事では、C言語・C++において整数型(int)の値を文字列(string)に変換する方法を解説します。基本の考え方:sprintf()関数を使う変換のロジックは非常にシンプルです。ここではsprintf()関数を使用します。sprintf()は、値や文字列をコンソール画面ではなく「文字列バッファ」に出力するための関数です。標準出力に表示するprintf()との違いは、出力先が文字列変数であるという点だけです。第1引数には、変換結果を保存したい文字配列(バッファ)を指定します。処理の流れは以下のとおりです。入力:ユーザーが数値(例:42)を入力する 出力:その数値に対応する文字列「42」が
-
C++で三分木(Ternary Tree)を実装するプログラム
三分木(Ternary Tree)は、各ノードが最大3つの子ノードを持つことのできる木構造データ構造です。子ノードは通常、「左(left)」「中央(mid/equal)」「右(right)」の3つとして表現されます。この木では、子を持つノードが親ノードとなり、子ノード側から親への参照を保持することも可能です。本記事では、文字列を格納するための三分探索木(Ternary Search Tree)をC++で実装し、木全体を走査して登録済みの単語をすべて出力する方法を解説します。 三分探索木の仕組み ここで扱うのは、文字列の集合を効率的に管理するための三分探索木です。二分探索木(BST)とトライ(T
-
【C++入門】二分探索木で辞書操作(挿入・検索・削除)を実装する方法
二分探索木(Binary Search Tree:BST)とは、すべてのノードが次の性質を満たすように構成された整列済みの二分木のことです。あるノードの右部分木に含まれるキーは、必ずその親ノードのキーより大きい。あるノードの左部分木に含まれるキーは、親ノードのキー以下である。各ノードが持てる子の数は2つまで。本記事では、この二分探索木の考え方を応用し、辞書操作(データの挿入・検索・削除)を実行するC++プログラムを紹介します。この実装では、キーを k mod max で分類して連結リストとして管理することで、効率的なデータ操作を実現しています。アルゴリズム挿入(insert)の場合Begin
-
【C++】再帰を使わずに二分木を中順走査(In-order Traversal)するプログラム
二分木を中順(In-order)で走査する場合、まず左の部分木を訪問し、次に根(ルート)、最後に右の部分木を訪問します。中順走査では、キーが昇順に出力されるという特徴があります。この記事では、再帰を使わずに二分木を中順走査するC++プログラムを紹介します。 非再帰中順走査の仕組み 再帰を使わない中順走査では、スタックを利用します。大まかな手順は以下のとおりです。 現在のノードがNULLになるまで、ノードをスタックにpushしながら左の子へ移動します。 左端に到達したら、スタックの先頭ノードをpopしてその値を出力します。 取り出したノードの右の子へ移動し、スタックが空かつ現在のノードがNUL
-
C++で二分探索木(AVL木)の左回転を実装するプログラム
二分探索木とは二分探索木(Binary Search Tree)とは、すべてのノードが次の性質を満たすソート済みの二分木です。ノードの右部分木には、親ノードのキーより大きいキーがすべて格納されるノードの左部分木には、親ノードのキーより小さいキーがすべて格納される各ノードが持てる子ノードは最大2つまで木の回転(Tree Rotation)とは木の回転とは、二分木の要素の順序(ソート順)を崩すことなく木の構造を変更する操作です。回転では、あるノードを1つ上へ、別のノードを1つ下へ移動させます。回転は木の形状を変えるために使われ、小さな部分木を下へ、大きな部分木を上へ移動することで木の高さを抑えられ
-
C++で二分木の後順(ポストオーダー)走査を非再帰的に実装する方法
二分木を後順(ポストオーダー)で走査する場合、まず左の部分木を訪問し、次に右の部分木、最後に根(ルート)を訪問します。この記事では、再帰を使わずに後順走査を実現するC++プログラムを紹介します。ここではスタックを利用して実装します。 アルゴリズム 後順走査の手順: 開始 関数 postorder_traversal(struct node *t, struct tree **top) を宣言 もし t == NULL ならば 「空の木です」と表示して return 「Postorder Data Using Stack :」と表示
-
【C++】二分探索木の回転操作を徹底解説!AVL木のバランス調整プログラム
二分探索木(BST)とは 二分探索木(Binary Search Tree:BST)は、すべてのノードが次の性質を満たすように整列された二分木です。 右部分木の条件: ノードの右部分木に含まれるキーは、必ずその親ノードのキーより大きい。 左部分木の条件: ノードの左部分木に含まれるキーは、必ずその親ノードのキー以下である。 子の数の制限: 各ノードが持てる子は最大2つまで。 木の回転(Tree Rotation)とは 木の回転とは、二分木の要素の順序(ソート順)を崩すことなく木の構造だけを変更する操作です。回転を行うと、あるノードが1段階上へ移動し、別のノードが1段階下へ移動します。 こ