-
C++ STLのforward_list assign()関数の使い方を徹底解説
本記事では、C++におけるforward_listのassign()関数の動作について詳しく解説します。forward_listとはforward_listは、通常のリスト(std::list)と異なり、次の要素とのリンクのみを保持するコンテナです。通常のリストは前後両方向の要素とリンクしているため、前方・後方のどちらの方向にも反復処理が可能ですが、forward_listは前方方向にしか反復できません。その代わり、メモリ使用量が少なく、軽量な動作が特徴です。assign()関数とはforward_list::assign()関数は、C++標準テンプレートライブラリ(STL)の一部です。この関
-
C++STLのforward_list::cbegin()関数の使い方を徹底解説
この記事では、C++のforward_list::cbegin()関数の動作について詳しく解説します。 forward_listは、通常のlistコンテナと異なり、次の要素へのリンクのみを保持する単方向連結リストです。通常のlistは前後の要素双方とリンクしているため双方向の走査が可能ですが、forward_listは前方方向にしかイテレートできません。その代わり、メモリ消費が抑えられ軽量であるという利点があります。 forward_list::cbegin()関数はC++標準テンプレートライブラリ(STL)の一部であり、リストの最初の要素を指すイテレータを取得するために使用されます。この関数
-
C++ STLのforward_list::cend()関数の使い方を徹底解説
C++標準テンプレートライブラリ(STL)のforward_list::cend()関数の働きについて解説します。 通常のlistは前後両方向の要素へのリンクを保持しているため双方向の走査が可能ですが、forward_listは次の要素へのリンクのみを保持しており、前方方向にしか走査できません。 forward_list::cend()はC++標準テンプレートライブラリの一部であり、リストの末尾要素の直後(過去末尾)を指す定数イテレータを取得するために使用されます。このイテレータは実際の要素を指すものではなく、走査範囲の終端を示すマーカーとして機能します。 この関数を呼び出すには、<fo
-
【C++ STL】forward_list::cbefore_begin()関数の使い方を徹底解説
本記事では、C++の標準テンプレートライブラリ(STL)に含まれるforward_list::cbefore_begin()関数の動作について解説します。forward_listとは通常のlistは、次の要素だけでなく前の要素へのリンクも保持しているため、双方向のイテレーションが可能です。一方、forward_listは次の要素へのリンクのみを保持する単方向連結リストであり、前方方向にしかイテレートできません。forward_list::cbefore_begin()はC++標準テンプレートライブラリの一部であり、リストの先頭要素の直前の位置を指すイテレータを取得するために使用されます。この関
-
C++ STLのforward_list::emplace_after()とemplace_front()の使い方を徹底解説
本記事では、C++におけるforward_list::emplace_after()とforward_list::emplace_front()関数の動作について詳しく解説します。 forward_listは、前後双方向に走査できる通常のリスト(std::list)とは異なり、次の要素とのリンクのみを保持する片方向リンクリストです。そのため前方方向にしかイテレーションできませんが、その分メモリ効率に優れています。 forward_list::emplace_after()とforward_list::emplace_front()はC++標準ライブラリの一部であり、利用するには<forw
-
C++のisprint()関数の使い方と動作を解説
isprint()関数とはC++のisprint()関数は、ヘッダーファイル「cctype.h」に定義されている組み込み関数で、指定した文字が印字可能(プリント可能)かどうかを判定します。isprint()は、印字可能な文字に対してtrueを返します。空白文字( )も印字可能とみなされ、trueが返される点に注意してください。また、cctypeヘッダーファイルには、ロケール固有の動作をするバージョンも用意されています。isprint()関数の主な特徴一連の文章の中に含まれる印字不可能な文字を簡単にチェックできます。印字不可能な文字を効率的に処理できる組み込み関数です。プログラマーが記述するコー
-
C++のSTLを使って配列内のNで割り切れる要素を検索する方法
配列が与えられ、その中からNで割り切れる要素を見つけ出すことが課題です。この問題は、C++の標準テンプレートライブラリ(STL)に用意されているcount_if()関数を使うことで簡単に解決できます。 count_if()関数とは? count_if()は、指定された条件を満たす配列内の要素の個数を返す関数です。条件の判定には、ユーザーが定義した関数やラムダ式を渡すことができます。 構文 count_if(LowerBound, UpperBound, function) パラメータの説明 下限(Lower Bound) − 配列やその他のシーケンスの先頭要素を指します。 上限(Upper
-
【C++】STLのcount_if()を使って配列内の奇数・偶数の要素数を検索する方法
配列が与えられたとき、C++の標準テンプレートライブラリ(STL)を活用して、その配列に含まれる奇数と偶数の要素の個数を求めることを考えます。この問題を解決するために、STLに用意されているcount_if()関数を使用します。count_if()関数とはcount_if()は、指定した条件(述語)を満たす要素の個数を、指定された範囲内から数え上げて返すアルゴリズム関数です。構文count_if(LowerBound, UpperBound, function)説明 − この関数は、指定された条件を満たす配列内の要素の個数を返します。3つの引数を受け取ります。下限(LowerBound) −
-
UbuntuにDoxygenをインストールする方法【コマンド付きで徹底解説】
Doxygenとは Doxygenは、アノテーション(注釈)付きのC++ソースコードからドキュメントを自動生成するための、事実上の標準ツールです。C++だけでなく、C、Objective-C、C#、PHP、Java、Python、IDL(CORBA、Microsoft、UNO/OpenOffice版)、Fortran、VHDL、Tclなど、幅広いプログラミング言語に対応している点も大きな特徴です。 この記事では、Ubuntu環境にDoxygenをインストールする手順と、インストール後の基本的なドキュメント生成の流れまで、順を追ってわかりやすく解説します。 Doxygenのインストール手順 D
-
C++でマトリックスの最大パス合計を求める方法|動的計画法(DP)による実装
問題の概要この問題では、サイズ M×N の2次元行列が与えられ、その中から最大パス合計を見つけるプログラムを作成します。ここでいう最大パス合計とは、最初の行の任意の要素を出発点とし、最後の行の任意の要素を終点として移動しながら通過する要素をすべて足し合わせた値のうち、最大になるものを指します。移動として許されているのは真下への移動と斜め下への移動の2種類のみです。具体例で理解する入力:matrix [][] = 3 5 9 1 7 2 4 8 6出力: 24説明: 最大パスは 9 → 7 → 8 となり、その合計は 9 + 7 + 8 = 24 です。アプローチ:動的計画法(
-
C++で配列から最大周囲長の三角形を求めるアルゴリズムと実装例
問題文非負整数の配列が与えられます。この配列から3つの要素を選び、最大の周囲長を持つ三角形を構成する組み合わせを見つけてください。例入力配列が {5, 1, 3, 5, 7, 4} の場合、最大周囲長は (7 + 5 + 5) = 17 となりますアルゴリズム配列を降順(非増加順)にソートします。こうすることで、先頭の要素が最大値、末尾の要素が最小値になります。ソート後の配列で、最初の3要素が三角形を構成できるなら、それが最大周囲長の三角形となります。この貪欲法が正しく動作する理由は、三角形不等式にあります。辺を a ≥ b ≥ c とすると、三角形が成立する条件は a < b + c
-
C++で2つの配列の各要素同士の最大XORを求める方法
この記事では、n個の要素を持つ2つの配列AとBが与えられたとき、配列Aの各要素について配列Bのどの要素と組み合わせればXORが最大になるかを求めるプログラムをC++で作成します。 つまり、配列Aの各要素ごとに、配列Bの中からXOR値が最も大きくなる相手を選び出すのが課題です。 問題の例 具体例を使って問題を理解しましょう。 入力: array A = {3, 6, 11, 9} array B = {8, 2, 4, 1} 出力: 11 14 15 13 説明: 配列Aの各要素と配列Bのすべての要素とのXORの組み合わせを計算し、それぞれの最大値を選択します。 3 XOR 8 = 11 3
-
C++で指定範囲の最大プレフィックス合計(接頭辞和)を求める方法
問題文 n個の整数からなる配列とq個のクエリが与えられます。各クエリはlからrまでの範囲を指定するもので、それぞれのクエリに対して、範囲l~rにおける最大の接頭辞和(プレフィックス合計)を求めてください。 例 入力配列が arr[] = {-1, 2, 3, -5} の場合、 クエリ数 = 2 で、範囲は次の通りです。 l = 0, r = 3 l = 1, r = 3 このとき出力は 4 と 5 になります。 1つ目のクエリの範囲(0, 3)は [-1, 2, 3, -5] を指します。接頭辞(先頭から連続する要素の和)として扱うため、必ず -1 から始める必要があります。したがって、最
-
C++で合計がNに等しくなる素数の最大個数を求める方法
問題の概要この問題では、整数 N が与えられ、その合計がちょうど N に等しくなるような素数の最大個数を求めることを目標とします。まず前提として、素数とは 1 とその数自身でしか割り切れない正の整数のことです。たとえば 2、3、5、7、11 などが該当します。具体的な例を見てみましょう。入力: N = 9出力: 4説明:9 は以下のように素数の和として表すことができます: 2 + 2 + 2 + 3 = 9(4個) 3 + 3 + 3 = 9(3個) 2 + 2 + 5 = 9(3個) 2 + 7 = 9(2個) この中で最も多くの素数を使用しているのは「2, 2, 2, 3」の4個です。解き
-
C++で解くワイン販売問題:動的計画法で最大利益と最適な売却順序を求める
問題の概要n本のワインが一列に並んでおり、各ワインの価格を表す整数が与えられます。毎年、列の先頭または末尾にあるワインを1本売ることができます。ワインの価値は年月とともに上昇し、初年度の各ワインの利益を P1, P2, P3, …, Pn とすると、Y年目における i 番目のワインの利益は Y × Pi で表されます。毎年、先頭のワインを売る場合は「start」、末尾のワインを売る場合は「end」を出力し、最終的にすべてのワインから得られる最大利益を計算してください。入力例ワインの価格が {2, 4, 6, 2, 5} の場合、出力は以下のようになります:start end end start
-
C++で削除時間が待機時間以上の場合の配列からの最大削除数を求める方法
問題の概要この問題では、N個の要素からなる配列が与えられます。各要素には「削除時間」と「待機時間」が関係しており、削除時間が待機時間以上である場合にのみ要素を削除できるという条件のもとで、配列から削除できる要素の最大数を求めるのが課題です。配列の各要素の値は、その要素を配列から取り除くのにかかる時間(=削除時間)を表します。また、各要素には待機時間があります。これは、その要素が実際に削除されるまでに待たなければならない時間のことです。なお、配列内の要素の順序は、必要に応じて自由に入れ替えて構いません。入出力例具体例を使って問題を確認しましょう。入力: array = {12, 3, 11, 7
-
C++で数値にk個の区切り点を設定した後の最大セグメント値を求める方法
この問題では、大きな数値を表す文字列と、区切り点(ブレークポイント)の数を表す整数kが与えられます。私たちのタスクは、数値にk個の区切り点を設定した後に得られる最大のセグメント値を見つけるプログラムを作成することです。つまり、文字列として与えられた数値の中にk個の区切り点を挿入することで生成できる、最大の数値を求める必要があります。問題の理解具体例を使って問題を確認しましょう。入力: 文字列 = 45972、k = 3出力: 97説明:考えられるすべての分割パターンは以下の通りです。 45 9 7 2 4  
-
C++で指定した合計値になる最大サイズの部分集合を求める方法
問題文 N個の要素からなる配列と合計値が与えられたとき、要素の合計が指定された値と一致する「最大サイズの部分集合」のサイズを求める問題です。 例 入力配列が arr = { 2, 3, 5, 10 }、合計値が sum = 20 の場合、出力は 4 になります。 なぜなら、 2 + 3 + 5 + 10 = 20 となり、配列の全要素を選んだ部分集合の合計が指定された合計値と一致するためです。 アルゴリズム この問題は動的計画法(DP)を用いて効率的に解くことができます。 まず、通常の部分和問題と同様に subset[i][j] というブール型のDPテーブルを用意します。これは「最初の j
-
C++で二分木の最大スパイラル和を求める方法
この記事では、二分木が与えられたときに、その最大スパイラル和(Maximum Spiral Sum)を求めるプログラムをC++で作成します。 スパイラル和とは? スパイラル和とは、二分木をスパイラル(ジグザグ)順に走査したときに通るノードの値の合計のことです。 スパイラル走査では、ノードを根(ルート)から葉に向かって辿ります。第1レベルは左から右へ、次のレベルは右から左へ、さらにその次はまた左から右へと、レベルごとに走査方向を交互に切り替えながら進むのが特徴です。 問題の例 例として、次のような二分木を考えてみましょう。 1 / \
-
C++で指定された時刻を単語(英語表記)に変換する方法
このチュートリアルでは、デジタル形式で与えられた時刻を、英語の単語による表現に変換するC++プログラムについて解説します。 例えば「8:29」という時刻が入力された場合、「twenty nine minutes past eight(8時29分)」というように、人間が日常的に使う言葉の形式へと変換するのが目的です。 変換のルール 英語の時刻表現には特有の言い回しがあります。このプログラムでは以下のルールに従って変換を行います。 0分の場合:「〜 o clock」(ちょうど〜時) 1分の場合:「one minute past 〜」(〜時1分過ぎ) 59分の場合:「one minute to 〜