C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++ STLの配列アルゴリズム徹底解説!all_of・any_of・none_of・copy_n・iotaの使い方

    C++11で追加されたSTLの配列アルゴリズムとは C++11以降、STL(標準テンプレートライブラリ)には配列やコンテナを効率的に扱うためのアルゴリズム関数が多数追加されました。これらの関数は主に <algorithm> ヘッダーに定義されており、ループ処理を自前で書く必要がなくなるため、コードの可読性と保守性が大きく向上します。ここでは、実践で特に役立つ5つの関数をサンプルコードとともに解説します。 1. all_of():すべての要素が条件を満たすか判定する all_of() は、コンテナ内のすべての要素が指定した条件を満たす場合に true を返す関数です。たとえば「配列

  2. C++で左右の偶数・奇数の出現回数が一致する配列インデックスを見つける方法

    問題の概要 ここで取り上げるのは次のような問題です。n個の要素を持つ配列が与えられたとき、「あるインデックスの左側にある偶数の出現回数と右側にある偶数の出現回数が等しい」、または「左側にある奇数の出現回数と右側にある奇数の出現回数が等しい」という条件を満たすインデックスを1つ見つけます。該当するインデックスが存在しない場合は -1 を返します。 例として、配列が {4, 3, 2, 1, 2, 4} の場合を考えてみましょう。このとき答えは 2 になります。インデックス2の要素は「2」であり、その左側には奇数が1つ(3)、右側にも奇数が1つ(1)しか存在しないためです。 解決のアプローチ こ

  3. C++で木の辺に重みを割り当て、重みの総和が最大となるパスを最小化する方法

    問題の概要 ここでは、木(ツリー構造)に関する興味深い問題を取り上げます。木とその辺の重みの総和 S が与えられたとき、残りのすべての辺に重みを割り当てることを考えます。条件は、割り当てた重みの合計がちょうど S になること、そして重みの観点で最長となるパスの長さをできる限り小さくすることです。 解法のアプローチ この問題の鍵となるのは、木の基本的な性質です。木の中の任意のパスに含まれる葉(リーフ)ノードは、最大で2つまでという点です。この性質を活用すれば、シンプルに最適な解を導き出すことができます。 具体的な戦略は次のとおりです。 葉ノードに直接接続している辺だけに重みを割り当てる そ

  4. C++で親ポインタを使った二分探索木(BST)へのノード挿入方法

    二分探索木(BST)に新しいノードを挿入する場合、一般的には再帰的な方法が用いられ、その際に各部分木の根のアドレスを返します。本記事では、もうひとつのアプローチとして、親ポインタを維持しながら挿入を行う方法を紹介します。親ポインタを保持しておくと、特定のノードの祖先をたどったり、中順後続ノード(inorder successor)を求めたりする処理などで非常に役立ちます。基本的な考え方は、再帰呼び出しによって左部分木・右部分木のアドレスを受け取り、その戻り値のノードに対して親ポインタを設定するというものです。これにより、挿入処理の中ですべての親ポインタが正しく設定されることが保証されます。なお

  5. C++で「delete this」は使える?正しい条件とリスクをわかりやすく解説

    C++におけるdelete演算子とthisポインタとは delete演算子は、変数が確保していた記憶域(メモリ領域)を解放するために使用される演算子です。 thisポインタは、非staticメンバ関数の内部からのみアクセスできる特殊なポインタであり、そのメンバ関数を呼び出したオブジェクトのアドレスを指します。簡単に言えば、thisポインタは現在のオブジェクト、すなわちクラス自身のインスタンスを指し示しているのです。 オブジェクトを通じてメンバ関数を呼び出すたびに、コンパイラは密かに、呼び出し元オブジェクトのアドレスを第1引数としてメンバ関数へ渡しています。これこそがthisポインタの正体です。

  6. static const vs #define vs enum?C++における定数定義方法の違いと使い分け

    「static const」とは「static const」は、static(記憶クラス指定子)とconst(型修飾子)を組み合わせたものです。staticは変数の寿命とアクセス範囲を決定します。変数をstatic付きで宣言すると、プログラムが実行されている間ずっとメモリ上に保持されます。一方、通常の自動変数(auto変数)は、その変数が定義された関数の実行が終了すると破棄されます。constは型修飾子の一種で、型システムを通じて値に関する追加情報を表現するために使われます。const修飾子を使って初期化された変数は、それ以降の値の変更を受け付けません。つまり、static constで宣言・

  7. C++で実装するサイクルソートのアルゴリズムとサンプルプログラム

    サイクルソート(Cycle Sort)は、インプレース(追加メモリをほとんど使わない)かつ非安定な比較ソートアルゴリズムです。最大の特徴は、元の配列への書き込み回数が理論上の最小値になるという点で、これは他のどのインプレースソートアルゴリズムにもない性質です。このアルゴリズムの基礎となるアイデアは、「ソート対象の順列は複数のサイクル(巡回)に分解でき、それぞれのサイクルを個別に回転させることでソート結果が得られる」というものです。他のほとんどのソートとは異なり、サイクルソートでは要素を単に「どかす」ために別の場所へ書き込むことが一切ありません。各値は、すでに正しい位置にあれば0回、そうでなけれ

  8. 最初のn個の自然数の立方和を求めるC++プログラム

    1、2、3、4…といった正の整数は「自然数」と呼ばれます。本記事では、ユーザーから正の整数 n を入力として受け取り、13+23+33+…+n3 の値(つまり最初の n 個の自然数の立方和)を計算して表示する C++ プログラムを紹介します。入力と出力の例入力:n = 3 出力:36計算の流れ13+23+33 = 1 + 8 + 27 = 36このように、1 から n までの各整数を 3 乗し、それらをすべて足し合わせたものが求める値になります。C++での実装例(ループを使用する方法)最も基本的な方法は、for ループで 1 から n まで順番に処理しながら、各数値の 3 乗を累積変数に加算し

  9. 数値が2の累乗かどうかを判定するC++プログラムの書き方

    与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法を紹介します。まず、どのような数が2の累乗に該当するのかを確認しておきましょう。基本的な考え方は、数値が偶数である間は繰り返し2で割り続け、最終的に1になれば2の累乗、それ以外の場合は2の累乗ではないと判定するというものです。よりスマートな判定方法としては、数値の対数(log)を取る方法があります。底を2とした対数の計算結果が整数であれば、その数は2の累乗であり、整数でなければ累乗ではありません。2の累乗となる数は以下の通りです。2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 ...22

  10. C++で文字列からスペースを削除する方法【初心者向けサンプルコード付き】

    このプログラムは、入力された文字列からスペース(空白文字)をすべて取り除きます。文字列の容量を節約したい場合や、空白を含まない整形済みデータが必要な場合などに便利な処理です。以下に、実際の入出力例とともに、具体的な実装方法をわかりやすく解説します。 入力:Hello World 出力:HelloWorld プログラムの仕組み 文字列や文章からスペースを削除するには、まずユーザーに文字列の入力を求めます。その後、文字列を先頭から1文字ずつ走査し、スペースが存在するかどうかをチェックしていきます。 スペースが見つかった場合は、そのスペース以降にある文字をすべて1つずつ前方へずらして詰めます。これ

  11. C++のmutableキーワードとは?使い方とconstオブジェクトでの動作を解説

    この記事では、C++におけるmutableキーワードの役割と使い方について詳しく解説します。mutableは、C++における記憶クラス指定子(ストレージクラス)の一つです。mutableとして宣言されたデータメンバは、所属するオブジェクトがconst型であっても常に変更可能という特別な性質を持ちます。「オブジェクト全体は定数として扱いたいが、特定のメンバ変数だけは変更できるようにしたい」というケースでは、そのメンバにmutableを指定することで柔軟に対応できます。キャッシュ値やロックフラグ、アクセス回数などの内部的な状態管理によく使われるテクニックです。サンプルコード以下の例を見て、muta

  12. C++ vs Java vs Python?3大プログラミング言語の違いを徹底比較

    本記事では、C++、Java、Pythonという3つの人気プログラミング言語の基本的な違いについて解説します。まず「C++とJava」の違いを表形式で確認し、続いて「JavaとPython」の違いを比較していきます。言語選びの参考としてぜひご活用ください。 C++とJavaの主な違い C++とJavaはどちらも強力なオブジェクト指向言語ですが、設計思想や動作の仕組みに大きな違いがあります。以下の表で主な相違点を整理しました。 項目C++Java メモリ管理ポインタ、構造体、共用体、参照を使用できるポインタは非対応。参照をサポートし、スレッドやインターフェースにも対応 ライブラリ低レ

  13. C++でスタックを1つだけ使って二分木の葉ノードを左から右へ出力する方法

    本記事では、二分木の葉ノードを左から右の順で出力するプログラムを紹介します。ここでのポイントは、スタックを1つだけしか使えないという制約です。push() 操作で二分木のノードをスタックに挿入し、pop() 操作で葉ノードを取り出して表示します。葉ノードとは?葉ノード(リーフノード)とは、左ポインタと右ポインタがどちらも NULL になっている、木の末端にあるノードのことです。つまり、そのノードは親ノードではないことを意味します。実行例入力 : 12 21 32 41 59 33 70 出力 : 41 59 33 70上記の例では、値が 41、59、33、70 のノードが葉ノードに該当します。

  14. C++で二分木のレベル順走査(幅優先探索)を行ごとに出力する方法

    二分木が与えられたとき、そのレベル順走査(幅優先探索)の結果を、レベル(行)ごとに表示する関数をC++で実装します。 レベル順走査とは、木の最上位(ルート)から開始し、同じ深さにあるノードを左から右へ順に訪問していく手法です。上の階層から下の階層へと処理を進め、各レベルの出力を1行として表示していきます。 問題の例 例として、次のような二分木を考えてみましょう。 3 / \ 2 1 / \ \ 10 20 30 この二分木に対してレベル順走査を行うと、次のような出力が得られます。 Level 0:

  15. C++で二分木の各ノードのセットビット数を出力する方法

    二分木が与えられたとき、本記事で紹介する関数は、各ノードに格納されたキーの値を2進数に変換し、その2進表現に含まれるセットビット(1)の個数を返します。例キーとして 10、3、211、140、162、100、146 を持つ二分木を考えてみましょう。各キーの2進表現とセットビット数は以下のようになります。キー2進表現セットビット数(出力)101010230011221111010011514010001100316210100010310011001003146100100103__builtin_popcount 関数についてここでは GCC が提供する組み込み関数 __builtin_pop

  16. C++で二分木のすべてのノードのレベルを出力する方法

    二分木(バイナリツリー)が与えられたとき、各ノードに格納されたすべてのキーについて、そのノードが属するレベル(根をレベル1として数える)を出力するのが本記事の目的です。上記の木では、ノードは次のように配置されています。10 はレベル 1 3 と 211 はレベル 2 140、162、100、146 はレベル 3特定のキーが与えられた場合、プログラムはそのキーが属するレベルを出力できなければなりません。入出力例入力: 10 3 211 140 162 100 146 出力:     10 のレベルは 1     3

  17. C++で二分木の奇数レベルにあるノードを出力する方法

    はじめに二分木が与えられたとき、プログラムは木の奇数レベルにあるノードを出力する必要があります。ここでいうレベルとは、二分木の階層を表し、ルートをレベル1として1からnまで数えます。実装方法については特に指定がないため、再帰または反復のどちらかのアプローチを選択できます。本記事では、コードが簡潔になる再帰的なアプローチを採用します。プログラムは関数を再帰的に呼び出し、その関数が奇数レベルのノードを取得して出力します。上記の二分木の場合 −レベル1のノード: 10 レベル2のノード: 3 と 211 レベル3のノード: 140、162、100、146この木では、レベル1とレベル3が奇数レベルに該

  18. C++で再帰を使わずに二分木のルートからリーフまでのパスを出力する方法

    二分木が与えられたとき、ルートからリーフ(葉)までの複数のパスをすべて出力する必要があります。しかし、ここでの課題は再帰を使用せずに実装することです。通常、木の探索には再帰がよく使われますが、今回は制約として再帰が使えないため、反復処理(イテレーティブな方法)で木を走査します。そのために、STLのmapを活用します。このマップには各ノードとその親ノードの対応関係を格納し、レベル順走査(またはスタックを用いた走査)によってリーフノードを検出した時点で、親へのポインタをたどることでルートからリーフまでのパスを出力できます。上記の二分木の場合、ルートからリーフまで到達するためのパスは以下のように複数

  19. C++で二分木の根から葉への最短経路を出力する方法|BFS(幅優先探索)による実装

    問題の概要二分木が与えられたとき、根(ルート)から葉(リーフ)に至る複数の経路の中から、最も短い経路を見つけ出して出力するプログラムを作成します。木は左から右へと走査するため、同じ深さの最短経路が複数存在する場合は、左側にある最初に走査された最短経路を出力します。この問題は、キュー(queue)を使ったレベル順走査(幅優先探索・BFS)で各レベルを順にたどることで解くことができます。BFSは浅い階層から順に探索を進めるため、最初に見つかった葉への経路が、すなわち根から葉への最短経路となります。上図の二分木では、根から葉への経路として以下のものが考えられます。10 -> 3(すべての経路の

  20. 【C++】二分木内の任意の2つのノード間のパスを出力する方法

    はじめに 本記事では、C++プログラミングにおいて二分木(バイナリツリー)内の任意の2つのノード間のパス(経路)を出力する方法を解説します。 前提として、すべてのノードが互いに異なる値を持つ二分木が与えられ、その中から指定した2つのノードをつなぐ経路を出力することを目標とします。 例として、次のような二分木を考えます。 具体例: ノード140からノード211までの経路を出力したい場合、期待される出力は以下の通りです。 Output: 140->3->10->211 解決のアプローチ 基本的なアイデアは、「ルートノードから目的の2つのノードそれぞれへの経路」を求め、それらを

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:69/300  20-コンピューター/Page Goto:1 63 64 65 66 67 68 69 70 71 72 73 74 75