-
C++ STLのforward_list::remove()関数の使い方と実例解説
本記事では、C++ STLにおける forward_list::remove() および forward_list::remove_if() 関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるforward_listとは?forward_list(前方リスト)は、シーケンスコンテナの一種で、シーケンス内の任意の位置に対して定数時間での挿入・削除操作を可能にするコンテナです。内部的には単方向連結リスト(singly-linked list)として実装されており、各要素が次の要素へのリンクを持つことで順序が維持されます。双方向リストである std::list と比べてメモリ効
-
C++ STL list::erase() 関数の完全ガイド
この記事では、C++ STL の list::erase() 関数の動作、構文、使用例について解説します。 STL における List とは std::list は、シーケンスの任意の位置への要素の挿入と削除を定数時間で行えるデータ構造です。内部的には 双方向連結リスト として実装されており、メモリ上では非連続な領域に要素が配置されます。 配列、vector、deque と比較して、任意の位置への挿入・削除・要素の移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅く、イテレータを用いた順次アクセスが基本となります。forward_list(単
-
C++ STLのlist::merge()関数とは?使い方とサンプルコードを解説
本記事では、C++ STLのlist::merge()関数について、その動作・構文・具体的な使用例を詳しく解説します。 STLにおけるlist(リスト)とは? listは、シーケンス内の任意の位置に対して一定時間での挿入・削除が可能なデータ構造です。内部は双方向連結リストとして実装されており、連続しないメモリ領域への配置が許容されています。そのため、配列やvector、dequeと比較して、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセスは低速であるという特徴があります。また、listはforward_listと似ていますが
-
C++ STLのlist::pop_back()関数の使い方を徹底解説
本記事では、C++におけるlist::pop_back()関数の動作、構文、および具体的な使用例について詳しく解説します。STLにおけるlistとは?list(リスト)は、シーケンス内の任意の位置に対して定数時間での挿入と削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、非連続的なメモリ割り当てが可能です。そのため、配列、vector、dequeと比較して、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は低速であるという特徴があります。listはforward_listと似
-
C++ STLのdeque::at()関数とdeque::swap()関数の使い方を解説
本記事では、C++ STLで提供されているdeque::at()関数とdeque::swap()関数について、それぞれの構文、動作、戻り値を詳しく解説します。STLにおけるdeque::at()とdeque::swap()とは?deque(Double Ended Queue:両端キュー)は、その名のとおり、両端から要素の追加・削除ができるシーケンスコンテナです。どちらの端からでも自由にデータを挿入・削除できます。dequeはvectorに似ていますが、vectorと異なり連続したメモリ領域への格納は保証されていない点が特徴です。その一方で、両端における要素の挿入・削除処理では、dequeの方
-
C++でSTLのset_union()を使って2つのベクトルを結合する方法
このチュートリアルでは、C++のSTL(標準テンプレートライブラリ)を活用して、与えられた2つのベクトル(vector)を結合する方法を解説します。 2つのベクトルを結合するには、STLが提供するset_union()関数を使用します。set_union()は、2つのソート済み範囲の「和集合」を計算し、共通する要素を重複なく1つにまとめた結果を出力先へ書き込む関数です。 set_union()を使うときの注意点 set_union()で正確な結果を得るには、入力となる両方のベクトルがあらかじめソートされていることが前提です。そのため、結合処理の前にsort()を呼び出して、各ベクトルを昇順に
-
C++で同じサイズの2つの配列を高速に交換する方法
この記事では、C++において同じサイズの2つの配列を素早く交換(スワップ)する方法について解説します。要素を1つずつ手作業で入れ替える代わりに、標準ライブラリが提供する std::swap() を使えば、わずか1行のコードで2つの配列の中身を効率的に入れ替えることができます。std::swap()とはstd::swap() は <utility> ヘッダーで定義されている関数で、2つのオブジェクトの値を交換します。配列に対して使用した場合、同じサイズ・同じ型であれば、各要素をまとめて交換してくれます。サンプルコード#include <iostream> #include
-
C++でオブジェクトの動的確保を制限する方法|new演算子をprivateにするテクニック
本チュートリアルでは、C++においてオブジェクトの動的なメモリ確保(ヒープへの生成)を制限する方法について解説します。その鍵となるのは、new演算子をクラスのprivate領域に配置することです。new演算子がprivateになると、クラスの外部からnewキーワードを使ってオブジェクトを動的に生成することができなくなり、インスタンスはスタック上(自動記憶域期間を持つ変数として)でのみ作成できるようになります。コード例#include <iostream> using namespace std; class Test { // new
-
C++でSTLのreverse()関数を使ってベクトルを反転する方法
このチュートリアルでは、C++のSTL(標準テンプレートライブラリ)を使用して、ベクトル(vector)を反転させる方法について解説します。ベクトルを反転するには、STLライブラリが提供するreverse()関数を使用します。reverse()関数は、指定された範囲内の要素の順序を逆順に入れ替える関数で、<algorithm> ヘッダーで定義されています。第1引数に範囲の先頭イテレータ、第2引数に末尾イテレータを渡すだけで、簡単に要素を反転できます。サンプルコード#include <bits/stdc++.h> using namespace std; int main
-
C++のSTLを使ってvectorを降順にソートする方法をわかりやすく解説
このチュートリアルでは、C++のSTL(標準テンプレートライブラリ)を使用して、vectorの要素を降順にソートする方法について解説します。vectorを降順にソートするには、<algorithm>ヘッダーに含まれるsort()関数と、比較用の関数オブジェクトgreater<int>()を組み合わせます。通常、sort()関数はデフォルトで昇順にソートしますが、第3引数にgreater<int>()を指定することで、降順でのソートが簡単に実現できます。サンプルコード#include <bits/stdc++.h> using namespace
-
【C++入門】データのトリプレット(3つ組)をベクターに格納する方法
このチュートリアルでは、C++においてデータのトリプレット(3つの値の組)をベクター(vector)に格納する方法を解説します。ベクターの1つの要素に3つの値をまとめて保持したい場合、ユーザー定義構造体を作成し、その構造体型を要素とするベクターを宣言するのが基本的なアプローチです。実装の考え方手順は以下の通りです。3つのメンバ変数を持つ構造体を定義するその構造体型を要素とする vector を作成するpush_back() を使ってトリプレットを順次追加するサンプルコード#include<bits/stdc++.h> using namespace std; // 3つの値をまと
-
C++で異なるコンテナ間のサブレンジを交換する方法
このチュートリアルでは、C++の標準ライブラリ関数 std::swap_ranges を使用して、vector や list といった異なる種類のコンテナ間でサブレンジ(部分範囲)を交換する方法を解説します。 swap_ranges 関数とは swap_ranges は <algorithm> ヘッダーで定義されているアルゴリズム関数です。第1引数と第2引数で指定した範囲 [first1, last1) の要素を、第3引数 first2 を起点とする範囲の要素と順番に入れ替えます。 重要なポイントとして、この関数は2つの範囲が異なる種類のコンテナに属していても、要素型が同じであれ
-
C++のテンプレート特殊化とは?仕組みと実装例をわかりやすく解説
この記事では、C++におけるテンプレートの特殊化(Template Specialization)について、基本的な考え方と具体的なコード例を交えて解説します。 テンプレート特殊化とは何か? sort() のような標準的なテンプレート関数は、あらゆるデータ型に対して使用でき、どの型でも同じように動作します。これは汎用性が高い反面、「特定の型だけは別の処理をしたい」というケースには対応できません。 そこで活躍するのがテンプレートの特殊化です。特定のデータ型(ユーザー定義型を含む)に対してのみ、異なる動作を持たせた専用の実装を定義することができます。 テンプレート特殊化には主に以下の2種類がありま
-
C++のテンプレートと静的変数の仕組みを徹底解説
この記事では、C++におけるテンプレート(template)と静的変数(static変数)がどのように相互作用するのかを、具体的なサンプルコードを通して解説します。重要なポイント:テンプレートの各インスタンスは独立しているC++では、関数テンプレートやクラステンプレートを実体化すると、型ごとに独立したインスタンスが生成されます。そのため、テンプレート内で宣言されたstatic変数も、各インスタンスがそれぞれ独自のローカルコピーを持つことになります。これはC++プログラミングにおいて非常に重要な挙動です。サンプルコード#include <iostream> using namespa
-
C++で二分木をリンクリストにフラット化(平坦化)する方法
二分木が与えられたとき、それをその場(in-place)でリンクリストへフラット化(平坦化)することを考えます。具体的には、すべてのノードを右ポインタで連結し、左ポインタを null にした、一本の連結リストのような構造へ変換します。例えば、次のような二分木があるとします。これをフラット化すると、出力は次のようになります。アルゴリズムの手順この問題は、逆後順走査(右 → 左 → 根)を利用することで効率的に解けます。手順は以下の通りです。prev を null で初期化します。ルートを引数にとる再帰関数 solve() を定義します。root が null の場合は、そのまま戻ります。まず r
-
C++で連結リストを並べ替える方法:リオーダーアルゴリズムの実装
問題の概要 次のような連結リストを考えます。l1 → l2 → l3 → l4 → … → l(n-1) → lnこれを、以下の形式になるように並べ替えます。l1 → ln → l2 → l(n-1) → … ここでの重要な制約は、リストノードが保持している値を変更してはならないという点です。並べ替えはノード同士のつながり(next ポインタ)の付け替えだけで行う必要があります。 例えば、リストが [1,2,3,4,5] である場合、出力は [1,5,2,4,3] となります。 解法の考え方 この問題は「中央を見つける」「後半を反転する」「2つのリストを交互につなぐ」という3つのフェーズに分
-
C++で連結リストをO(n log n)時間・定数空間でソートする方法
連結リストが与えられたとき、これをO(n log n)の時間計算量・定数空間計算量で並べ替えることを考えます。たとえば、リストが [4,2,1,3] である場合、出力は [1,2,3,4] となります。 この問題はマージソートの考え方を応用することで効率的に解決できます。連結リストはランダムアクセスができないためクイックソートやヒープソートは不向きですが、マージソートならリスト構造に適した形で、余分な配列領域を使わずに実装できます。 アルゴリズムの手順 まず、2つのソート済みリストを昇順に統合するための補助メソッド merge() を定義します。このメソッドは2つのリスト l1 と l2 を
-
C++で分数を小数文字列に変換する方法(循環小数への対応)
2つの整数(分数の分子と分母)が与えられたとき、その分数を文字列形式の小数に変換することを考えます。小数部分に循環する桁(循環節)がある場合は、その繰り返し部分を括弧 () で囲んで表現します。例えば、分子が 2、分母が 3 の場合、出力は 0.(6) となります。この問題は、筆算による割り算の処理をシミュレートしながら、余りの出現履歴を記録することで解くことができます。以下の手順に従って実装していきましょう。アルゴリズム分子が 0 の場合は、そのまま 0 を返します。結果を格納するための配列 ans を定義します。符号の判定を行います。分子が負かつ分母が正、または分子が正かつ分母が負の場合は
-
C++で合計が指定値以上となる最短の連続部分配列を求める方法
問題概要 n個の要素からなる配列と正整数 s が与えられます。このとき、要素の合計が s 以上となる「連続する部分配列(サブアレイ)」の中で最も短いものの長さを求めてください。条件を満たす部分配列が存在しない場合は、0 を返します。 例えば、配列が [2,3,1,2,4,3]、目標値が 7 の場合、答えは 2 になります。これは部分配列 [4,3] の合計が 7 であり、条件を満たす中で最も短いためです。 解法のアプローチ:スライディングウィンドウ この問題は「スライディングウィンドウ(双方向ポインタ)」と呼ばれる手法で効率的に解けます。ウィンドウの右端を順に広げながら、合計が条件を満たし続け
-
C++で最大の正方形を見つける方法|動的計画法による解説
問題概要 0 と 1 のみで構成された 2 次元バイナリ行列が与えられます。この中から「1」だけで構成される最大の正方形を見つけ、その面積を返してください。 たとえば、次のような行列が与えられたとしましょう。 10100101111111110010 この場合、2行目と3行目にまたがる 2×2 の正方形が存在するため、出力は 4 となります。 アルゴリズム:動的計画法 この問題は動的計画法(DP)を使うことで効率的に解けます。元の行列と同じサイズの補助行列 m を用意し、各セル m[i][j] には「位置 (i, j) を右下の角とする最大の正方形の一辺の長さ」を記録していきます。 具体的な手