-
C++のインライン関数とは?基本概念から実装例までわかりやすく解説
C++におけるインライン関数(inline function)は、クラスと組み合わせてよく使われる強力な機能です。関数をインラインとして宣言すると、コンパイラはコンパイル時に関数が呼び出されるすべての場所に、その関数のコードのコピーを直接埋め込みます。 インライン関数の注意点 インライン関数に変更を加えた場合、コンパイラはすべての呼び出し箇所のコードを再度置き換える必要があるため、その関数を利用しているすべてのコードを再コンパイルしなければならない点に注意しましょう。再コンパイルを行わなければ、古い処理内容のまま動作し続けることになります。 また、コンパイラは関数の定義が複数行にわたる場合など
-
C++のvoid関数でreturnする方法|値以外を返すテクニックを解説
void関数が「void(空)」と呼ばれるのは、何も返さないためです。しかし、「void関数は何も返せない」という説明は、必ずしも正しいとは言えません。void関数から値を返すことはできませんが、値以外のものを返したり、return文を活用したりすることは可能です。本記事では、その具体的な方法をサンプルコードとともに解説します。void関数でもreturn文は使えるvoid関数は値を返すことができませんが、return文そのものを記述することは可能です。引数なしのreturn文は「この時点で関数を終了する」という意図を明示的に示す働きがあり、処理の流れが分かりやすくなるため、コードの可読性向上
-
C++のファンクター(関数オブジェクト)とは?基本と使い方を解説
C++におけるファンクター(関数オブジェクト)とは、クラスのインスタンスであるオブジェクトを、あたかも通常の関数のように呼び出せるようにする仕組みです。これは、クラス内でoperator()(関数呼び出し演算子)をオーバーロードすることで実現されます。 ファンクターを使うと、引数を1つ受け取る関数と同じように、一連のデータに対して何らかの処理を実行できます。標準ライブラリの<algorithm>ヘッダにある各種アルゴリズム関数と組み合わせることで、柔軟で再利用性の高いコードを書くことが可能になります。 サンプルコード 以下は、1つの引数を受け取ってその二乗を返す関数を、関数オブジェ
-
C++における構造体とクラスの違いとは?アクセス指定子の挙動を実例付きで解説
はじめにC++において、構造体(struct)とクラス(class)は本質的にはほぼ同じものです。どちらもメンバ変数やメンバ関数を持つことができ、継承・カプセル化といったオブジェクト指向の機能も同様に利用できます。しかし、両者にはいくつかの細かな違いが存在します。この記事では、その違いをサンプルコードと実行結果を交えてわかりやすく解説します。違い1:メンバのデフォルトのアクセスレベル最も大きな違いは、メンバのデフォルトのアクセス権限です。クラスのメンバはデフォルトで「private(非公開)」になりますが、構造体のメンバはデフォルトで「public(公開)」になります。実際に、以下の2つのコー
-
C++のコピーコンストラクタはいつ呼び出される?仕組みと具体例を解説
コピーコンストラクタとは コピーコンストラクタとは、同じクラスの既存オブジェクトを使って新しいオブジェクトを初期化するための特殊なコンストラクタです。主に次のような場面で呼び出されます。 同じ型の別オブジェクトからオブジェクトを初期化するとき オブジェクトを関数の引数として値渡しするとき 関数からオブジェクトを値として返すとき クラス内でコピーコンストラクタが定義されていない場合、コンパイラが自動的にデフォルトのコピーコンストラクタを生成します。しかし、クラスがポインタ変数を持ち、動的メモリ確保を行っている場合には注意が必要です。デフォルトの「浅いコピー(シャローコピー)」では同じメモリ領
-
C++ STLのset find()関数の使い方を解説
C++ STLのsetコンテナにおけるfind()関数は、指定した要素を検索し、その要素を指すイテレータを返します。もし要素がセット内に存在しない場合は、最後の要素の直後の位置(つまりend()が返すイテレータ)を指す値が返されます。この関数の計算量はO(log n)であり、setが内部的に平衡二分探索木(赤黒木)で実装されているため、高速な検索が可能です。アルゴリズムBegin セットコンテナの要素を出力するための関数 printS() を定義する。 空のセットコンテナ s を初期化し、いくつかの要素を挿入する。 関数を呼び出して、セットコンテナの要素を出力する。
-
C++ STLのsetコンテナでlower_bound()関数を使う方法
C++ STLのsetコンテナには、lower_bound()という便利なメンバ関数が用意されています。この関数は、引数として渡した値kと等しい要素を指すイテレータを返します。もしkがset内に存在しない場合は、「kより大きい要素のうち最小のもの」、つまり直後の要素を指すイテレータを返します。 setは内部的に要素を常にソート済みの状態で保持しているため、lower_bound()は二分探索によってO(log n)の計算量で効率的に動作します。 アルゴリズム Begin 空のsetコンテナsを初期化する。 lower boundの値を指すためのイテレータを宣言する。 s
-
C++ STLのセット(set)とマップ(map)とは?違いと基本的な使い方を解説
セット(std::set)とは セット(Set)は抽象データ型の一種で、要素の値そのものが識別子として機能するため、すべての要素が一意である必要があります。一度セットに追加した要素の値を直接変更することはできませんが、該当する要素を削除してから、変更後の値を新たに挿入し直すことは可能です。 マップ(std::map)とは マップ(Map)は、要素を「キー」と「値」のペアとして格納する連想コンテナです。各要素はキー値(key)とマップ値(mapped value)を持ち、同一のキー値を持つ要素が複数存在することはありません。 以上の説明から、両者の違いは次のように整理できます。 セット:
-
【C++ STL】set::begin()とset::end()の使い方をサンプルコードで解説
C++のSTLコンテナであるstd::setには、要素を走査するための重要なメンバ関数としてbegin()とend()があります。 set::begin()は双方向イテレータの一種で、setコンテナの先頭要素を指すイテレータを返します。setは自動的に要素が昇順にソートされるため、begin()が指すのは常に最小の値を持つ要素です。 set::end()も同様に双方向イテレータを返しますが、こちらは最後の要素そのものではなく、最後の要素の「次」の位置(終端)を指す点に注意が必要です。つまり、end()が返すイテレータは有効な要素を参照しておらず、主にループの終了条件として使用されます。 サンプ
-
【C++ STL】match_resultsのmax_size()関数とは?使い方とサンプルコードを解説
C++ STLにおけるmatch_resultsクラスのmax_size()関数は、正規表現のマッチ結果を格納するコンテナが保持できる要素数の最大値(上限)を返します。この値は実装や環境によって異なり、理論上の最大サイズを示すものです。ポイント:この関数は引数(パラメータ)を受け取りません。構文match_results_object.max_size()戻り値として、コンテナが保持可能な最大要素数を整数型で返します。サンプルコード以下は、max_size()関数を使って、match_resultsオブジェクトが保持できる最大要素数を出力する例です。#include<iostream&g
-
C++の構造体やクラスで使うSTL優先度キュー(priority_queue)の実装方法
C++のSTL(Standard Template Library)が提供するstd::priority_queueは、内部的に最大ヒープ(max-heap)として実装されています。そのため、要素を取り出す際には常に最も大きい値が先頭に現れます。しかし、構造体やクラスのようなユーザー定義型をそのまま格納する場合、どのメンバを基準に優先順位を判定するのかをコンパイラが判断できません。そこで必要になるのが、比較用のファンクタ(関数オブジェクト)です。本記事では、学生情報を管理する構造体を例に、構造体を優先度キューで扱う方法を解説します。アルゴリズム処理の流れは以下のとおりです。Begin
-
C++ STLのunordered_multimap::rehash()関数の使い方を徹底解説
C++ STLのunordered_multimap(およびunordered_map)が提供するrehash(N)関数は、コンテナ内のバケット数を引数n以上に設定するためのメンバ関数です。引数nが現在のバケット数よりも大きい場合、再ハッシュ(rehash)が強制的に実行され、新しいバケット数はnと等しいか、それ以上の値になります。一方、引数nが現在のバケット数以下である場合は、バケット数に変化が生じず、再ハッシュも強制されません。つまり、この関数は「最低でもn個のバケットを確保する」という指示であり、戻り値は返しません。構文void rehash(size_type n);パラメータn: コ
-
C++ STLのunordered_multimapにおけるreserve()関数の使い方
C++ STLのunordered_multimapが提供するreserve()関数は、コンテナに少なくともn個の要素を格納できるよう、バケット数を最も適切な値へ設定します。引数nが「現在のバケット数 × max_load_factor」よりも大きい場合、コンテナは自動的にバケット数を増やし、強制的に再ハッシュ(rehash)を行います。reserve()には戻り値がなく、要求する最小容量に対応する最小要素数を指定する引数nのみを受け取ります。アルゴリズムBegin マップコンテナmを宣言する。 m.reserve(6) = バケットに必要な最小容量分のサイズを予約する。
-
C++ STLのunordered_multimap size()関数の使い方を解説
C++ STLにおけるunordered_multimapのsize()関数は、コンテナ内に格納されている要素の数を返すメンバ関数です。この記事では、size()関数の基本的な使い方と、実際のコード例を通じてその動作を解説します。アルゴリズムBegin 空のマップコンテナ m を宣言する。 reserve関数を使って、マップコンテナに適切な バケット数(bucket_count)の上限を設定する。 マップコンテナに値を挿入する。 size()関数を使って、unordered multimapコンテナのサイズを出力する。 Endサンプルコード#includ
-
C++STLのunordered_multimap swap()関数の使い方を解説
C++ STLのunordered_multimapにおけるswap()関数は、同じサイズ・同じ型の2つのmultimapコンテナ同士で要素を入れ替えるために使用される関数です。この記事では、swap()関数の基本的な使い方を、アルゴリズムとサンプルコードを交えてわかりやすく解説します。アルゴリズムswap()関数を使った処理の流れは以下の通りです。開始 空のmapコンテナ m と m1 を宣言する。 m と m1 の両方に値を挿入する。 swap()関数を実行し、m と m1 の値を入れ替える。 入れ替え後の m の値を出力する。 入れ替え後の m1
-
C++ STLのvector insert()関数の使い方を徹底解説
はじめにC++ STLのvectorクラスが提供するinsert()関数は、指定した位置の要素の前に新しい要素を挿入することで、コンテナのサイズを動的に拡張できるメンバ関数です。insert()はC++ STLにあらかじめ定義されている関数で、push_back()が末尾への追加しかできないのに対し、先頭や途中などvectorの任意の位置に要素を追加できる点が特徴です。insert()関数の3つの構文vectorのinsert()関数には、用途に応じて3種類の構文が用意されています。1. 位置と値を指定して挿入するvector_name.insert(pos, value);挿入位置を示すイテ
-
C++ STLのvector::begin()とvector::end()の使い方を徹底解説
C++のSTL(標準テンプレートライブラリ)におけるvector::begin()およびvector::end()は、ベクター内の要素を走査するために欠かせないメンバ関数です。本記事では、それぞれの役割と実際のコード例を通じて、その使い方をわかりやすく解説します。 vector::begin() とは vector::begin()は、コンテナ(ベクター)の先頭要素を指すイテレータを返す双方向イテレータ用の関数です。この戻り値を使うことで、ベクターの最初の要素から順番にアクセスすることができます。 vector::end() とは vector::end()は、コンテナの末尾(最後の要素の次の
-
C++のSTLでstd::arrayを実装するサンプルプログラム
C++のSTL(標準テンプレートライブラリ)には、固定長の配列を安全かつ便利に扱えるコンテナstd::arrayが用意されています。本記事では、配列に対するさまざまな操作(サイズの取得・要素の挿入・先頭/末尾要素の参照・全要素の表示など)をメニュー形式で選択できるサンプルプログラムを、擬似コード・実際のコード・実行結果とあわせて解説します。 配列に対する操作と擬似コード まず、プログラム全体の流れを擬似コードで確認しましょう。 開始 main()関数内で TRUEの間、以下を繰り返す 選択肢を表示する 選択内容を入力として受け取る sw
-
【C++】再帰を使わない二分木の中順(Inorder)トラバーサルの実装方法
二分木を中順(Inorder)でトラバースするとは、まず左部分木を訪問し、次にルート(根)ノード、最後に右部分木を訪問する手法のことです。特に二分探索木(BST)に対して中順トラバーサルを行うと、キーが昇順に出力されるという重要な性質があります。本記事では、再帰を使わずにスタックを活用して中順トラバーサルを実装するC++プログラムを紹介します。 アルゴリズム 再帰を使わない中順トラバーサルは、明示的なスタックを用いて以下の手順で実現します。 Begin Function inOrder(): スタック s を宣言する 現在のノード current を r
-
C++で.soファイル内のすべてのシンボルを一覧表示する方法
はじめに 共有ライブラリ(.soファイル)には、関数名や変数名などの多数のシンボルが含まれています。デバッグやライブラリの調査の際に、これらのシンボルを確認したい場面は少なくありません。本記事では、Linux環境で.soファイル内のすべてのシンボルを一覧表示する方法を紹介します。 readelfコマンドを使う方法 .soファイルはELF(Executable and Linkable Format)形式で保存されています。ELF形式のバイナリを読み取り、シンボル情報を抽出するには、readelfコマンドが便利です。 readelf -Ws libName.so 各オプションの意味は以下の通り