-
C++ STLのdeque emplace_front()とemplace_back()関数の使い方を解説
C++ STLにおけるdeque(両端キュー)のemplace_front()関数とemplace_back()関数の機能を、サンプルコードと実行結果とともにわかりやすく解説します。 Deque(両端キュー)とは Deque(デック)は「Double Ended Queue(両端キュー)」の略で、シーケンスコンテナの一種です。最大の特徴は、コンテナの先頭と末尾の両方で要素の追加・削除ができる点にあります。 通常のキュー(queue)データ構造では、データの挿入は末尾からのみ、削除は先頭からのみ行えます。バス停の行列をイメージすると分かりやすいでしょう。新しい人は列の末尾に並び、先頭にいる人から
-
C++のemplace_back()関数とは?dequeの末尾に要素を追加する方法を解説
C++のemplace_back()関数とはemplace_back()は、C++のSTLコンテナであるdeque(両端キュー)の末尾に新しい要素を挿入するためのメンバ関数です。push_back()と似た機能を持っていますが、emplace_back()はコンテナ内で直接オブジェクトを構築するため、一時オブジェクトの生成やコピーが発生せず、より効率的に要素を追加できる点が特徴です。構文dequename.emplace_back(value)パラメータvalue − dequeの末尾に挿入する要素を指定します。追加する要素のデータ型は、dequeの宣言時に指定した型と一致している必要がありま
-
C++ STLにおけるdeque clear()とdeque erase()の使い方を解説
この記事では、C++ STLにおけるdeque(デック)のclear()関数とerase()関数の機能について、サンプルコードを交えながら解説します。 Deque(デック)とは Deque(Double Ended Queue、双方向キュー)は、両端での要素の追加と削除を可能にするシーケンスコンテナです。通常のキュー(queue)データ構造では、データの挿入は末尾からのみ行い、削除は先頭からのみ行います。バス停の行列を例に考えてみましょう。行列に加わる人は必ず末尾から並び、先頭にいる人から順に乗車して行列から外れていきます。一方、双方向キュー(deque)では、両端のどちらからでもデータの挿
-
【C++】STLのlistにおけるpush_front()関数の使い方を徹底解説
本記事では、C++のpush_front()関数の仕組み、構文、そして具体的な使用例について詳しく解説します。 STLにおけるlistとは listは、シーケンス内の任意の位置に対して定数時間での挿入・削除を可能にするデータ構造です。listは双方向連結リスト(doubly linked list)として実装されており、非連続的なメモリ割り当てが可能です。 配列やvector、dequeと比較すると、listはコンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。また、listはf
-
C++ STLのlist::reverse()関数の使い方と実例解説
本記事では、C++におけるlist::reverse()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間O(1)での要素の挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、メモリの非連続的な割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。listはforward_listと似ていますが、forwar
-
C++ STLのlist::resize()関数とは?構文・パラメータ・使用例を徹底解説
本記事では、C++のSTL(Standard Template Library)におけるlist::resize()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置に対して定数時間での挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、非連続的なメモリ割り当てを行います。そのため、配列やvector、dequeと比較して、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、要素への直接アクセス(ランダムアクセス)は遅いという特徴があります。また
-
【C++】STLのlist::push_back()関数の使い方を徹底解説
本記事では、C++のlist::push_back()関数の仕組み、構文、および具体的な使用例について詳しく解説します。STLにおけるlistとはlistは、シーケンス内の任意の位置で定数時間での挿入・削除を可能にするデータ構造です。listは双方向連結リスト(doubly linked list)として実装されており、非連続的なメモリ割り当てを行います。そのため、配列やvector、dequeと比較して、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。一方で、listは要素への直接アクセス(ランダムアクセス)が遅いという弱点もあります。また、list
-
【C++ STL】listのpop_front()関数の使い方を徹底解説
本記事では、C++のpop_front()関数について、その仕組み、構文、そして具体的な使用例を詳しく解説します。 STLにおけるlistとは list(リスト)は、シーケンス内の任意の位置で定数時間による挿入・削除を可能にするデータ構造です。listは双方向連結リストとして実装されており、非連続的なメモリ割り当てが可能です。配列、vector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮します。その一方で、要素への直接アクセスは低速という特徴があります。listはforward_listと似ていますが、forward_listは
-
C++ STLのdeque::rbegin()関数とは?逆順走査の使い方とサンプルコード
本記事では、C++ STLにおけるdeque(デキュー)のrbegin()関数の機能について、具体例を交えてわかりやすく解説します。deque(デキュー)とは?deque(Double Ended Queue:両端キュー)はシーケンスコンテナの一種で、先頭と末尾の両端に対して要素の挿入・削除を効率的に行えるコンテナです。一般的なキュー(待ち行列)のデータ構造では、データの挿入は「末尾」からのみ行い、削除は「先頭」からのみ行うというルールがあります。例えば、バス停の行列をイメージすると分かりやすいでしょう。行列に並ぶ人は「末尾」から追加され、「先頭」にいる人から順に乗車して取り除かれます。一方、
-
【C++ STL】deque::rend()関数の使い方をサンプルコード付きで解説
C++ STLにおけるdeque(デック)のrend()関数の機能と使い方を、サンプルコードと実行結果とともに詳しく解説します。 deque(両端キュー)とは? dequeは「Double Ended Queue(両端キュー)」の略で、シーケンスコンテナの一種です。先頭と末尾の両方で要素の挿入・削除ができる点が最大の特徴です。 通常のキュー(queue)データ構造では、データの挿入は末尾からのみ行い、削除は先頭からのみ行います。バス停の行列を想像すると分かりやすいでしょう。新しく来た人は列の最後尾に並び、乗車するのは先頭にいる人から順番に、という具合です。一方、両端キュー(deque)では、
-
C++ STLのlist remove()関数の使い方を徹底解説
この記事では、C++のSTL(標準テンプレートライブラリ)におけるremove()関数の動作、構文、具体的な使用例について詳しく解説します。STLにおけるlistコンテナとはlistは、シーケンス内の任意の位置に対して定数時間で要素の挿入・削除を行えるデータ構造です。listは双方向リンクリストとして実装されており、非連続的なメモリ割り当てをサポートします。配列やvector、dequeと比較すると、コンテナ内の任意の位置への要素の挿入・抽出・移動において優れたパフォーマンスを発揮するのが特徴です。その一方で、要素への直接アクセス(ランダムアクセス)は遅いという欠点があります。listはfor
-
C++ STLのlist::clear()関数の使い方を徹底解説!構文と実行例
本記事では、C++のSTL(Standard Template Library)におけるlist::clear()関数の動作、構文、および具体的な使用例について詳しく解説します。 STLのリスト(std::list)とは? リストは、シーケンス内の任意の位置に対して定数時間で挿入・削除を行えるデータ構造です。C++のSTLでは、リストは双方向連結リストとして実装されており、メモリ上に非連続的に要素を配置できます。 配列やvector、dequeと比較すると、リストはコンテナ内の任意の位置への要素の挿入・移動において優れたパフォーマンスを発揮します。その一方で、要素への直接アクセス(ランダムア
-
C++ STLのdeque::insert()関数の使い方を徹底解説
本記事では、C++ STLにおけるdequeのinsert()関数の機能と具体的な使い方について詳しく解説します。 deque(デック)とは? dequeは「Double Ended Queue(両端キュー)」の略称で、コンテナの先頭と末尾の両端で要素の追加(拡張)と削除(縮小)が可能なシーケンスコンテナです。 通常のキューデータ構造では、データの挿入は末尾からのみ、削除は先頭からのみ行います。バス停の行列を思い浮かべると分かりやすいでしょう。新たに並ぶ人は必ず列の最後尾に加わり、先頭にいる人から順番に乗車して列から外れていきます。 一方、dequeではこの挿入と削除を両端のどちらでも行うこと
-
C++で解く「ユニークな二分探索木 II」― 再帰で全パターンのBSTを生成する方法
整数 n が与えられたとき、1 から n までの値を格納する、構造的にユニークな二分探索木(BST)をすべて生成することを考えます。例えば、入力が 3 の場合、生成される木は以下のようになります。解法のアプローチこの問題は再帰(バックトラッキング)を用いることで効率的に解けます。二分探索木の性質上、ある値 i を根にしたとき、左部分木には i より小さい値が、右部分木には i より大きい値が属します。この性質を利用して、各値を根とした場合の左右の部分木を再帰的に生成していきます。アルゴリズムの手順low と high を引数に取る再帰関数 generate() を定義します。結果を格納するため
-
C++で解くユニークな二分探索木の数え上げ問題
問題の概要整数 n が与えられたとき、値 1 から n までを格納する構造的に異なる二分探索木(BST)が何通り存在するかを求める問題です。例えば、入力が 3 の場合、答えは 5 となります。考えられる木の構造は以下の通りです。アプローチ:動的計画法(DP)この問題は動的計画法を使うことで効率的に解けます。ポイントは、「i 個のノードからなる二分探索木の総数」を「より小さい部分問題の答え」から組み立てられることにあります。根の値を j と固定すると、左部分木には 1〜j-1 の j-1 個の値が入り、右部分木には j+1〜i の i-j 個の値が入ります。したがって、次の漸化式が成り立ちます。
-
Pythonで二分探索木(BST)の妥当性を検証する方法
二分木が与えられたとき、それが有効な二分探索木(BST:Binary Search Tree)であるかどうかを判定する問題を考えてみましょう。二分探索木は、以下の条件を満たすものとして定義されます。あるノードの左部分木に含まれるノードのキーは、すべてそのノードのキーより小さい値であること。あるノードの右部分木に含まれるノードのキーは、すべてそのノードのキーより大きい値であること。左部分木と右部分木も、それぞれ二分探索木でなければならないこと。例えば、次のような二分木が与えられた場合を考えます。この場合、出力は true となります。解法のアプローチこの問題を解くためには、以下の手順に従います。
-
Pythonで二分木のルートからリーフまでの経路数値を合計する方法
0〜9の数字のみを含む二分木があるとします。このとき、ルートからリーフ(葉)までの各経路は、一つの数値を表すことができます。例えば、次のような二分木を考えてみましょう。この木には「2 → 1」と「2 → 3」の2つの経路があり、それぞれ 21 と 23 を表します。したがって、出力は 21 + 23 = 44 となります。解法のアプローチこの問題は、深さ優先探索(DFS)を使うことで効率的に解けます。手順は以下の通りです。再帰関数 dfs() を作成します。引数としてノードと num(初期値は0)を受け取ります。ノードが存在する場合:num := num * 10 + ノードの値 で現在の経路
-
Pythonで解くコイン両替問題:最小枚数の硬貨で目標金額を作る動的計画法
異なる額面のコインのリストと合計金額 amount が与えられたとき、その金額をちょうど作るために必要な最小のコイン枚数を求める関数を定義します。どの組み合わせでも金額を作ることができない場合は -1 を返します。 例えば、コインが [1, 2, 5]、金額が 11 の場合、出力は 3 となります。これは 5 + 5 + 1 = 11 という3枚の組み合わせで構成できるためです。 解法のアプローチ(動的計画法) この問題は、動的計画法(DP)を用いることで効率的に解くことができます。手順は以下の通りです。 金額が 0 の場合は 0 を返す コイン配列の最小値が金額よりも大きい場合は -1
-
C++で解く「組み合わせの総和IV」――メモ化再帰による実装方法
問題概要すべての要素が正の整数で、かつ重複のない整数配列が与えられたとします。このとき、要素を足し合わせて正の整数 target になる組み合わせが何通りあるかを求めるのが本問題です。順序が異なる並びは、別々の組み合わせとして数える点に注意してください。例えば、配列が [1, 2, 3]、ターゲットが 4 の場合、考えられる組み合わせは [[1,1,1,1], [1,1,2], [1,2,1], [2,1,1], [1,3], [3,1], [2,2]] の7通りとなるため、出力は 7 になります。解法のアプローチこの問題は、メモ化再帰(トップダウン型の動的計画法)を用いることで効率的に解けま
-
C++で3つのソート済み配列の交差(共通要素)を求める方法
問題概要厳密に増加順(昇順)にソートされた3つの整数配列 arr1、arr2、arr3 が与えられます。この中から、3つの配列すべてに出現する整数のみを含む、ソート済みの配列を返す必要があります。例えば、配列が [1,2,3,4,5]、[1,2,5,7,9]、[1,3,4,5,8] である場合、3つすべてに共通して現れる整数は 1 と 5 のみなので、出力は [1,5] となります。解決アプローチこの問題は、ハッシュマップを使って各要素の出現回数を数えることで解決できます。手順は以下の通りです。結果を格納するための配列 res を用意します3つのマップ f1、f2、f3 を作成しますi を 0