C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++のstd::vector::resize()とstd::vector::reserve()の違いを徹底解説

    std::vector(ベクター)は動的配列のように振る舞い、要素の挿入や削除に応じて自動的にサイズを調整し、メモリ(ストレージ)もコンテナ自身が管理してくれる非常に便利なコンテナです。 しかし、「要素数そのものを変更したい」のか「メモリを事前に確保したい」のかによって、使うべき関数は異なります。resize() と reserve() の主な違いは次の通りです。 resize(): ベクトルのサイズ(要素数)そのものを変更します。指定した数が現在より小さい場合は余分な領域と要素が削除され、大きい場合は新しい要素が追加されます。 reserve(): サイズは一切変更せず、少なくとも指定した

  2. C++のvector::resize()とvector::reserve()の違いとは?使い方を徹底解説

    std::vectorは動的配列と同じように、要素の挿入や削除が行われるたびにサイズを自動的に調整できるコンテナで、ストレージの管理はvector自身が担います。 vector::resize()とvector::reserve()の最も大きな違いは、resize()はベクターのサイズ(要素数)を実際に変更するのに対し、reserve()はサイズをまったく変更しないという点です。reserve()は「少なくとも指定した個数の要素を、メモリの再割り当てなしで格納できるようにする」ためだけに使われます。一方、resize()では指定した値が現在の要素数より小さい場合、メモリが縮小され余分な領域は

  3. C言語で関数へのポインタを宣言する方法を徹底解説

    ポインタとは、別の変数やメモリブロックのアドレス、すなわちメモリ上の特定の場所を直接指し示す値を格納するための変数です。通常の変数や定数と同じように、ポインタも何らかのアドレスを格納して利用する前に、必ず宣言しておく必要があります。基本構文データ型 *変数名関数へのポインタの場合は、戻り値の型と引数の型も併せて指定します。処理の流れ(アルゴリズム)show 関数を定義します。整数型の変数 x を宣言し、その値を出力します。main 関数内で、整数型の引数を受け取る関数へのポインタ p を宣言します。p を show() 関数のアドレスを指すポインタとして設定します。ポインタ p を使って関数を

  4. C++における基底クラスと派生クラスの例外キャッチ:正しい順序の重要性

    C++で基底クラスと派生クラスの両方の例外を捕捉したい場合は、派生クラスのcatchブロックを基底クラスのcatchブロックよりも必ず先に配置する必要があります。この順序を守らないと、派生クラスのcatchブロックは決して実行されず、常に基底クラス側が処理を引き受けてしまいます。これは、C++の例外処理が上から順に型の一致判定を行う仕組みになっているためです。派生クラスのオブジェクトは基底クラスの型としても扱えるため、基底クラスのcatchブロックが先にあると、そこで例外が捕捉されてしまうのです。アルゴリズムBegin クラスBを宣言する。 クラスBを継承する別のクラスDを宣言

  5. 【C++解説】例外処理時にデストラクタはどう動く?オブジェクト破棄の仕組みを実例で理解する

    C++において、デストラクタはオブジェクトが破棄されるタイミングで自動的に呼び出され、確保していたメモリなどのリソースをシステムへ解放します。そして重要なのが例外処理との関係です。クラス内で例外がスローされた場合、catchブロックが実行される前に、すでに構築済みのオブジェクトに対してはデストラクタが自動的に呼び出されます。この仕組みは「スタック巻き戻し(stack unwinding)」と呼ばれ、C++の例外安全な設計において非常に重要な概念です。ただし、一つ注意点があります。コンストラクタの中で例外が発生した場合、そのオブジェクトは「構築が完了していない」状態であるため、そのオブジェクト自

  6. C++でソート済みのpair型vectorに対して二分探索を行う方法

    C++では、std::pair を格納したソート済みの std::vector に対しても、標準ライブラリの binary_search 関数を使って二分探索(バイナリサーチ)を実行できます。ただし、pair のどの要素(first / second)をキーとして比較するかをコンパイラに伝える必要があるため、カスタム比較ファンクタを定義するのがポイントです。 アルゴリズム 処理の流れは以下の通りです。 開始   keycompare 構造体を宣言する     operator()(const pair& v, const int& k) を定義し、bool を返す      

  7. C++で2つのベクトルの外積(クロス積)を計算するプログラムの書き方

    はじめに本記事では、2つの3次元ベクトルの外積(クロス積)を計算するC++プログラムを紹介します。まず外積の数式的な定義を確認し、その後アルゴリズムとサンプルコード、実行結果まで順番に解説します。外積の定義いま、次のような2つのベクトルを考えます。M = m1i + m2j + m3kN = n1i + n2j + n3kこのとき、MとNの外積は次の式で表されます。M × N = (m2n3 − m3n2)i − (m1n3 − m3n1)j + (m1n2 − m2n1)kここで、各括弧内の値がそれぞれ i、j、k 方向の単位ベクトルに掛かる係数(成分)となります。なお、外積の結果はスカラー

  8. C++でvectorから部分ベクトル(サブベクトル)を抽出する方法

    C++では、元の std::vector の一部を切り出して、新しいvector(部分ベクトル)を作成できます。本記事では、イテレータと範囲コンストラクタを活用して、指定した開始位置・終了位置の要素を取り出す方法を、アルゴリズムとサンプルコード、実行結果とともにわかりやすく解説します。 アルゴリズム Begin   開始位置 m と終了位置 n を引数に取る関数   s(vector const &v, int m, int n) を宣言する。     auto first = v.begin() + m;(m番目の要素を指すイテレータ) &n

  9. C++のvectorとは?仕組みと主要なメンバ関数の使い方を実行例つきで解説

    C++のvector(ベクトル)とは C++のstd::vectorは、いわば「賢い配列」です。要素の挿入や削除が行われるたびに、動的配列として自動的にサイズを伸縮でき、内部の記憶域(メモリ)の管理までもコンテナ側が引き受けてくれます。そのため、開発者はメモリの確保や解放を意識することなく、C++で最も広く使われるコンテナとして活用できます。 vectorの要素は連続したメモリ領域に配置されます。この特徴により、インデックスを使ったランダムアクセスが高速であるだけでなく、イテレータを使った順次アクセス(走査)にも対応しています。さらに、データの挿入・削除は、先頭・中間・末尾のいずれの位置に対し

  10. C++でvectorに別のvectorを追加する方法を解説

    C++のstd::vectorに別のvectorを追加(連結)したい場合、最も簡単な方法はinsert()メソッドを使用することです。insert()メソッドは、指定した位置に要素や範囲を挿入できるため、あるvectorの中身を丸ごと別のvectorに追加する際に非常に便利です。アルゴリズムBegin 関数show()を宣言する。 show()関数内で、vectorのコンストラクタを引数として受け取る。 for (auto const& i : input) 変数iの値を出力する。 vector型のvect1を宣言し、値を

  11. C++でvectorを初期化する4つの方法を徹底解説【サンプルコード付き】

    C++のstd::vectorには、さまざまな初期化方法があります。用途や場面に応じて使い分けることで、より読みやすく効率的なコードを書くことができます。本記事では、代表的な4つの初期化方法を、アルゴリズム・サンプルコード・実行結果つきで順番に紹介します。 1) push_back()メソッドによる初期化 まず空のvectorを宣言し、push_back()関数を使って要素を1つずつ末尾に追加していく方法です。実行時に動的に要素を組み立てたい場合に便利です。 アルゴリズム Begin vector型の変数vを宣言する。 push_back()関数を呼び出して、値をvへ挿入す

  12. C++でstd::vectorをシャッフルする方法(Fisher-Yatesアルゴリズム)

    std::vectorの要素をシャッフルするには、古典的なFisher-Yatesシャッフルアルゴリズムを利用する方法があります。 このアルゴリズムでは、ベクターを先頭から線形に走査し、各要素を「その要素自身を含む残りの要素」の中からランダムに選ばれた要素と入れ替えていきます。これにより、すべての並び順が等しい確率で現れる、偏りのないシャッフルが実現できます。 アルゴリズム Begin show()関数を宣言する。 show()関数内で、ベクターのconst参照を引数として受け取る。 for (auto const& i : input) 変数iの値を

  13. C++でvectorの全要素を合計する方法|std::accumulateの使い方を解説

    C++のvector(可変長配列)に格納された全要素の合計は、標準ライブラリのstd::accumulate関数を使うことで非常に簡単に求められます。この関数は<numeric>ヘッダーで定義されており、指定した範囲内のすべての値を、第3引数で与えた初期値へ順次加算していきます。 アルゴリズム 開始   vector型の変数vを宣言する   配列形式でvに複数の値を初期化する   「すべての要素の合計は:」と出力する   accumulate(v.begin(), v.end(), 0) を呼び出し、vの全要素の合計を計算する   合計の結果を出力する 終了 サンプルコード #

  14. 【C++】コンストラクターにvector(ベクトル)を渡す方法をわかりやすく解説

    C++では、std::vectorをクラスのコンストラクターに渡すことで、オブジェクト生成時にまとめてデータを初期化できます。この記事では、ベクトルをコンストラクターに渡すシンプルなC++プログラムを、アルゴリズム・サンプルコード・実行結果とともに紹介します。アルゴリズム処理の流れは以下の通りです。開始   Vectorという名前のクラスを宣言する     vector<int>型のメンバー変数vecを宣言する     Vectorクラスのコンストラクターを宣言する       ベクトルオブジェクトvを引数として受け取る       vec = v として初期化する     ベクト

  15. C++でvector(ベクトル)を並べ替える方法:std::sort()の使い方

    C++でvector(可変長配列)を並べ替えるには、標準ライブラリの std::sort() 関数を使用します。この関数は <algorithm> ヘッダーで定義されており、デフォルトでは要素を昇順(小さい順)に並べ替えます。 また、安定ソートを行いたい場合は std::stable_sort を使用します。これは sort() と同じように動作しますが、値が等しい要素同士の相対的な順序を保持する点が異なります。さらに、要件に応じてクイックソートやマージソートなどのアルゴリズムを自前で実装して利用することも可能です。なお、std::sort() の平均計算量は O(N log N

  16. C++でベクトルを降順にソートする方法

    C++でベクトルをソートするには、std::sort()関数を使用するのが一般的です。この関数は<algorithm>ヘッダーで定義されています。また、等しい要素の相対的な順序を保持する安定ソートが必要な場合は、std::stable_sortを使用します。要件に応じて、クイックソートやマージソートなどのアルゴリズムを自前で実装して使うこともできます。ベクトルを降順でソートしたい場合は、std::greater<>()を第3引数としてstd::sort()に渡します。アルゴリズム開始 ベクトル型の変数 v を宣言する 配列形式で v に初期値を設定する

  17. C++でベクトル(vector)をコピーする5つの方法

    C++で std::vector を別のベクトルにコピーする方法は複数あります。本記事では、代表的な5つの手法をコード例とともに解説します。 方法1: std::copy を使う std::copy は、あるベクトルの要素を別のベクトルへコピーするための標準ライブラリ関数です。ヘッダー <algorithm> に定義されています。 構文 std::copy(first_iterator_o, last_iterator_o, back_inserter()); first_iterator_o = コピー元ベクトルの先頭イテレータ last_iterator_o = コピー元ベ

  18. C++でハードコードした要素を使ってstd::vectorを初期化する最も簡単な方法

    モダンC++(C++11以降)では、初期化子リストを使うことで、ハードコードした要素を用いてstd::vectorを非常に簡単に初期化できます。std::vector<int> vec = {1,2,3};このように、波括弧 {} の中に要素を並べて記述するだけで、コンパイラが自動的にvectorを構築してくれます。従来のように要素を一つずつpush_backする必要はありません。アルゴリズムここでは、初期化したvectorの全要素の合計値を求める例を紹介します。手順は以下の通りです。開始 vector v を初期化する。 accumulate を使って、v の全要

  19. C/C++におけるポインタのサイズはどれくらい?決まる仕組みを解説

    C/C++におけるポインタのサイズは固定ではなく、オペレーティングシステム(OS)やCPUアーキテクチャなど、さまざまな要因によって決まります。ポインタサイズを決める主な要因一般的に、ポインタのサイズは基盤となるプロセッサのワードサイズに依存します。例えば、以下のようになります。32ビットコンピュータ:ポインタサイズは4バイト(32ビット)が一般的64ビットコンピュータ:ポインタサイズは8バイト(64ビット)が一般的つまり、特定のアーキテクチャ上では、ポインタのサイズは常に固定値となります。同じ環境であれば、実行するたびにサイズが変わることはありません。ポインタのサイズはデータ型に依存しない重

  20. C++ポインタには何を代入すべき?NULL・0・nullptrの違いと正しい使い分け

    C++では、NULL はマクロとして定義されており、その実体は整数値の 0 です。つまり、C++において NULL も 0 も、どちらも「整数」として扱われます。 ポインタに代入できる3つの書き方 ポインタ変数 p に対しては、次の3通りの書き方が可能です。 float* p = NULL; float* p = 0; float* p = nullptr; この3つはいずれも「空ポインタ(null pointer)」として同じ結果になります。しかし、型の意味や安全性という点では重要な違いがあります。 nullptrとは?(C++11で導入されたキーワード) nullptr は、C++11で導

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:40/300  20-コンピューター/Page Goto:1 34 35 36 37 38 39 40 41 42 43 44 45 46