C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++のポインタ、スマートポインタ、shared_ptrを徹底解説

    ポインタ(Pointer)とはポインタは、変数のメモリアドレスを格納するための特殊な変数です。C++では、ポインタを利用することで、変数が配置されているメモリ上の場所を直接扱うことができます。構文Type *pointer;初期化Type *pointer; pointer = &変数名;主な特徴変数のアドレスを格納するために使用されます。null値を代入することができます。参照渡し(pass by reference)によって参照できます。ポインタ自体もスタック上に独自のメモリアドレスとサイズを持ちます。サンプルコード#include <iostream> using n

  2. C++のRAIIとスマートポインタ徹底解説!リソース管理を自動化するテクニック

    C++におけるRAIIとは?RAII(Resource Acquisition Is Initialization:リソース取得は初期化)は、C++においてリソースのライフサイクルを制御するための重要なプログラミング技法です。この手法では、リソースの寿命をオブジェクトの寿命に結び付けます。具体的には、複数のリソースを1つのクラスにカプセル化し、オブジェクト生成時にコンストラクタでリソースを確保し、オブジェクト破棄時にデストラクタでリソースを解放します。これにより、リソースはオブジェクトが生存している間は確実に保持され、スコープを抜けると自動的に解放されるため、メモリリークやリソースリークを防ぐ

  3. C++のスコープ解決演算子(::)とthisポインタの違いをわかりやすく解説

    C++プログラミングにおいて、スコープ解決演算子(::)はクラスの静的メンバーやクラスメンバーにアクセスするために使用され、一方thisポインタは、ローカル変数が同じ名前のメンバー変数を隠してしまう場合に、オブジェクト自身のメンバーにアクセスするために使用されます。この記事では、それぞれの使い方をサンプルコードと実行結果付きで詳しく解説します。スコープ解決演算子(::)とはスコープ解決演算子「::」は、クラス名や名前空間を明示的に指定することで、特定のスコープに属するメンバーへ直接アクセスできる演算子です。特に静的メンバー(staticメンバー)へのアクセスや、ローカル変数によって隠されたクラ

  4. C++のポインタと参照パラメータの違いとは?基礎から徹底解説

    ポインタ(Pointer)とは ポインタ変数は、他の変数のメモリアドレスを格納するための変数です。ポインタを使うことで、変数そのものではなく、その変数が配置されているアドレスを間接的に操作できます。 構文 Type *pointer; 初期化 Type *pointer; pointer = &variable; // 変数のアドレスを代入 使用例: int x = 10; int *p; // ポインタの宣言 p = &x; // x のアドレスを代入 *p = 20; // ポインタ経由で x の値を変更 参照(Reference)とは パラ

  5. C++でポインタを参照渡しする理由とは?

    C++プログラミングにおいて、ポインタが指し示すオブジェクトそのものではなく、ポインタ自体を変更したい場合には、ポインタを参照渡し(参照による受け渡し)します。通常、ポインタを値渡しすると、関数内ではポインタのコピーが操作されるため、呼び出し元のポインタが保持するアドレスは変更されません。しかし、参照渡しにすることで、関数内での変更が呼び出し元のポインタに直接反映されるようになります。サンプルコード以下は、ポインタを参照渡しする方法の具体例です。#include <iostream> using namespace std; void Decrement( int*& d

  6. C++におけるスタックとヒープの適切な使い分けとは?

    C++では、メモリは主に「スタック」と「ヒープ」という2つの領域で管理されます。それぞれの特性を正しく理解し、適切に使い分けることは、効率的で安全なプログラムを書くうえで非常に重要です。スタックとはスタックは、関数内で宣言されたローカル変数が自動的に格納されるメモリ領域です。関数が呼び出されると必要なメモリが割り当てられ、関数の処理が終わると自動的に解放されます。つまり、関数内のローカル変数はすべてスタック上に存在することになります。ヒープとはヒープは、プログラムの実行時に動的にメモリを確保するために使用できる未使用のメモリ領域です。宣言した関数の寿命を超えてデータを保持したい場合(例えば、関

  7. 【C++】巡回セールスマン問題(TSP)を解くプログラム|全順列探索による最短経路の求め方

    巡回セールスマン問題(Travelling Salesman Problem、TSP)は、すべての都市を一度ずつ訪れ、最後に出発地点の都市へ戻るまでの最短経路を求める古典的な組合せ最適化問題です。グラフ理論においては、グラフ上のすべてのノードをカバーする最短経路を見つけるために用いられる手法です。本記事では、next_permutationによる全順列探索を利用して、グラフの最短経路を求めるC++プログラムを紹介します。アルゴリズムBegin    変数 vr = 4 をグローバルに定義する。    巡回セールスマン問題を実装する整数型関数 TSP を宣

  8. 二分探索(分割統治)アプローチで最大部分配列の合計を求めるC++プログラム

    二分探索は、計算量 O(log n) と非常に高速な探索アルゴリズムで、「分割統治法(divide and conquer)」という原理に基づいて動作します。このアルゴリズムが正しく機能するためには、対象となるデータ集合があらかじめソート済みである必要があります。 二分探索では、データ集合の中央にある要素と目的の要素を比較しながら特定の項目を探します。一致すればそのインデックスを返し、中央の要素の方が大きければ中央より左側の部分配列を、そうでなければ右側の部分配列を探索します。この処理を部分配列に対して繰り返し、探索範囲がゼロになるまで続けます。 本記事で紹介するのは、この分割統治の考え方を応

  9. 【C++】スパース行列(疎行列)を判定するプログラムの実装方法

    スパース行列(疎行列)とは、行列の要素の大部分が「0」で占められている行列のことです。機械学習や数値計算などの分野では大規模なデータを扱うことが多く、こうした行列が頻繁に登場するため、その判定方法や効率的な扱い方は重要なテーマとなっています。以下にスパース行列の一例を示します。この3×3の行列には0が5つ含まれており、全要素数9個の半分以上が0であるため、スパース行列と判定されます。0 0 9 5 0 8 7 0 0アルゴリズムスパース行列かどうかを判定する流れは、次の通りです。整数型の2次元配列 a[10][10] を宣言し、あらかじめ値を設定しておきます。ループ用変数 i・j とカウンタ

  10. C++のSTLを使って指定した範囲の素数を出力する方法

    C++のSTL(標準テンプレートライブラリ)を活用すると、指定した範囲内に存在する素数を効率よく出力できます。この記事では、エラトステネスの篩で素数の一覧を生成し、set_difference()による差集合の計算とremove_if()による不要な要素の削除を組み合わせて、任意の区間の素数だけを取り出す方法を解説します。 アルゴリズムの流れ 開始 ユーザー定義型 stl(unsigned long long int)を宣言する stl 型のベクトルを返す関数 number(a) を定義する bool 型のベクトル Prime_Number を宣言し、すべて

  11. C++で木(ツリー)のプリューファーコードを生成するプログラム

    プリューファーコード(Prüfer Code)は、ラベル付きの木を一意な数列として表現できる符号化手法です。頂点に1からpまでのラベルが付けられた木(頂点数はユーザーが指定)を入力すると、長さ「p − 2」の数列が生成され、これによってその木を一意に識別できます。 プリューファーコードとは n個のラベル付き頂点からなる木は、必ず長さ n−2 のプリューファーコードへ変換でき、逆にコードから元の木を復元することも可能です。この性質から、木の構造をコンパクトに扱う手段として広く知られており、有名なケイリーの公式(「n頂点のラベル付き木の総数は nn−2 通り」)の証明にも利用されています。 アルゴ

  12. 【C++】二分探索木(BST)の最小値を求めるプログラムの解説

    本記事では、二分探索木(Binary Search Tree:BST)に格納されたデータの中から最小値を求めるC++プログラムを紹介します。二分探索木には「左の子孫は親より小さい値を持つ」という性質があるため、木の左端にあるノードを順にたどっていくだけで、必ず最小値のノードに到達できます。 アルゴリズム 処理の手順は以下の擬似コードのとおりです。 開始 構造体ndを宣言する。 整数型の変数dを宣言する。 構造体nd型へのポインタlt(左子)を宣言する。 構造体nd型へのポインタrt(右子)を宣言する。 関数new_nd()(戻り値:構造体nd型、引数:

  13. C++ vs Java vs Python:3大プログラミング言語を徹底比較

    はじめに:プログラムが支える現代社会 現代において、プログラムは私たちの日常生活に欠かせない存在となっています。あらゆるものが自動化され、IoT(モノのインターネット)によって相互に接続される時代です。 数あるプログラミング言語の中でも、特に開発者から人気が高いのがC++、Java、Pythonの3つです。それぞれに異なる特徴を持ち、用途に応じて使い分けられています。 C++の特徴 C++は高速なコンパイル型言語であり、その優れた実行パフォーマンスから広く普及しています。多くのプログラマーが最初に学ぶ言語としても知られています。 Javaの特徴 Javaはプラットフォーム非依存であることが

  14. C++で解くブール行列の更新問題:1がある行と列をすべて1にする方法

    ここでは、興味深いブール行列の問題を取り上げます。0と1のみで構成されたブール行列が与えられ、その中で「1」がマークされている位置を見つけることが目的です。もし位置 mat[i][j] に 1 が存在するならば、i 行目と j 列目のすべての要素を 1 に変更します。具体例を見てみましょう。次のような行列が与えられたとします。1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0この行列に対して処理を実行すると、結果は以下のようになります。1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1(0,0) と (0,3)、そして (3,1) の位置に 1 があったため、それらの行

  15. C++で解く積配列パズル ― 除算なし・O(1)の追加メモリで実現する方法

    問題の概要今回は配列に関する興味深いパズルを取り上げます。n個の要素を持つ配列が与えられたとき、同じくn個の要素を持つ別の配列を作成します。ただし、新しい配列のi番目の要素には、元の配列のi番目の要素を除いた残りすべての要素の積を格納する必要があります。この問題には次の2つの制約があります。除算演算子(/)を使用してはならない出力用の配列以外、追加のメモリ領域はO(1)に抑えることもし除算が許されるなら話は簡単です。配列全体の積を事前に計算しておき、それを各要素で割った値を順に格納すればよいからです。しかし、配列に0が含まれると除算が使えない、積が大きくなるとオーバーフローの恐れがあるといった

  16. C++の積配列パズル:除算を使わずに解くアルゴリズムを徹底解説

    今回は配列に関する興味深い問題を取り上げます。n個の要素を持つ配列が与えられたとき、同じくn個の要素を持つ別の配列を作成します。ただし、新しい配列のi番目の位置には、元の配列のi番目の要素を除いた残りのすべての要素の積を格納する必要があります。さらに重要な制約として、除算(割り算)演算子を使用してはいけないという条件が課せられています。もし除算を使えるのであれば、この問題は非常に簡単です。まず全要素の総積を求め、それを元の配列のi番目の要素で割ればよいだけだからです。しかし、除算が禁止されている場合、別のアプローチが必要になります。解法のアイデア:左右からの累積積ここでは、leftとright

  17. C++の配列パズル:減算演算子を使わずに「自分以外の要素の合計」を求める方法

    今回は、配列に関する興味深い問題を紹介します。n個の要素を持つ配列が与えられ、それをもとに同じくn個の要素を持つ別の配列を作成します。ただし、新しい配列のi番目には、元の配列のi番目の要素を除いたすべての要素の合計を格納します。さらに重要な制約として、減算演算子(-)を使用してはいけないという条件が課されています。 問題のポイント もし減算が使えるのであれば、話は簡単です。まず全要素の合計を求めておき、そこからi番目の要素を引いた値を新しい配列のi番目に格納すればよいだけです。しかし、この問題では減算が禁止されているため、別のアプローチが必要になります。 そこで、各位置i(0〜n-1)について

  18. 【C++】配列内の隣接する要素同士の絶対差を求める方法

    この記事では、配列内の隣接する2つの要素のペアごとに絶対差(絶対値の差)を求める方法を解説します。配列に n 個の要素が含まれている場合、結果として得られる配列には n-1 個の要素が格納されます。例えば、配列の要素が {8, 5, 4, 3} である場合、計算結果は次のようになります。|8−5| = 3、|5−4| = 1、|4−3| = 1アルゴリズムpairDiff(arr, n)begin    res := 結果を格納するための配列    for i in range 0 to n-2, do       res[

  19. C++で配列の偶数・奇数インデックス要素の絶対差を求める方法

    この記事では、配列内の偶数インデックスと奇数インデックスにある要素の絶対差を求める方法を解説します。絶対差とは、2つの値の差が負になった場合にも絶対値を取ることを指します。 例として、配列 {1, 2, 3, 4, 5, 6, 7, 8, 9} を考えてみましょう。インデックスは0から始まるため、各要素は次のように分類されます。 偶数インデックス(0, 2, 4, 6, 8)の要素:1, 3, 5, 7, 9奇数インデックス(1, 3, 5, 7)の要素:2, 4, 6, 8 計算の手順 まず初期値0から出発し、該当するインデックスの要素を順番に見ながら、直前の累積値との差の絶対値を求めていき

  20. C++の複素数に対するacos()関数の使い方を解説

    複素数のacos()関数とはここでは、複素数に対するacos()メソッドについて解説します。C++では、<complex>ヘッダーファイルをインクルードすることで複素数を扱うことができます。このヘッダーには、複素数専用のacos()関数も用意されています。これは、通常のacos()関数(実数用の逆余弦関数)を複素数に対応させたバージョンであり、複素数の逆余弦(アークコサイン)を求めるために使用されます。この関数は、複素数を入力パラメーターとして受け取り、その逆余弦を複素数として返します。具体的なイメージをつかむために、以下のサンプルコードを見てみましょう。サンプルコード#inclu

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:64/300  20-コンピューター/Page Goto:1 58 59 60 61 62 63 64 65 66 67 68 69 70