C++樹林– category –
-
【C++】std::pow で累乗(べき乗)を計算する方法
はじめに C++で「2の8乗」や「3.14の2乗」といった、数値の**累乗(べき乗)**を計算したい場合、forループで地道に掛け算を繰り返す必要はありません。 標準ライブラリの <cmath> (C言語では <math.h>) ヘッダーには、このための std::pow と... -
【C++】指数関数 (exp) と対数関数 (log) を計算する方法
はじめに C++で科学技術計算やデータ分析を行う際、指数関数や対数関数は不可欠なツールです。標準ライブラリの <cmath> (C言語では <math.h>) ヘッダーには、これらの数学関数が用意されており、簡単に利用することができます。 この記事では... -
【C++】typeid の使い方 | 実行時のオブジェクトの型を判別する方法 (RTTI)
はじめに C++の継承とポリモーフィズム(多態性)を使うと、親クラスへのポインタの配列に、様々な種類の子クラスオブジェクトをまとめて格納できます。しかし、時には「このポインタが今指しているのは、『戦士』オブジェクトなのか、それとも『魔法使い... -
【C++】std::function の使い方 | あらゆる「呼び出し可能オブジェクト」を保持する方法
はじめに C++には、「呼び出し可能 (callable)」なものがいくつかあります。 通常の関数 ラムダ式 ()演算子をオーバーロードした関数オブジェクト(ファンクタ) これらはそれぞれ型が異なるため、通常は同じ変数に代入することはできません。しかし、<... -
【C++20】
入門 | 時間の取得・フォーマット・計算を完全解説 はじめに C++で日付や時間を扱う際、従来はC言語由来のtime.hを使うなど、少し扱いが面倒でした。C++20では、**<chrono>**ライブラリが大幅に拡張され、タイムゾーンの扱いや日付・時刻のフォーマットが、非常に簡単かつ型安全に行えるようになりま... -
【C++】std::complex の使い方 | 複素数を扱うための基本ガイド
はじめに C++で、数学や物理学、信号処理などの分野で現れる複素数(実部と虚部からなる数)を扱いたい場合、標準ライブラリの <complex> ヘッダーが非常に役立ちます。 このライブラリは、複素数を表現するための std::complex クラステンプレート... -
【C++】std::pair の使い方 | 2つの値をペアで扱う方法
はじめに C++でプログラミングをしていると、「キーと値」「姓と名」「x座標とy座標」のように、常に対(ペア)で扱いたい2つのデータが出てくることがあります。この目的のために、C++の標準ライブラリ <utility> には、std::pair という便利なクラ... -
【C++】std::tuple の使い方 | 複数の異なる型の値を一つにまとめる方法
はじめに C++で、関数の戻り値として複数の値を返したい場合や、いくつかの異なる型のデータを一時的に一つの変数で扱いたい場合があります。この目的のために、C++11では std::tuple というクラスが導入されました。 std::tuple は、std::pair の一般化版... -
【C++17】std::variant の使い方 | 型安全な共用体で複数の型を扱う
はじめに C++で、「intかもしれないし、stringかもしれない」といったように、複数の異なる型のうち、どれか一つを格納できる変数が欲しい場合があります。従来の共用体 (union) はこの問題を解決しますが、現在どの型が格納されているかを自分で管理する... -
【C++17】std::any の使い方 | あらゆる型の値を安全に保持する方法
はじめに C++は静的型付け言語であり、通常、一つの変数には一つの決まった型の値しか格納できません。しかし、時には「コンテナにintもstringも、自作クラスも、何でもかんでも格納したい」という場面があります。 C++17より前は、このような要求には voi... -
【C++20】数値の中間点(midpoint)と線形補間(lerp)を計算する方法
はじめに C++で、2つの数値のちょうど真ん中の値(中間点)や、2点間を滑らかにつなぐ途中の値を求めたい場合があります。 C++20では、これらの計算を安全かつ効率的に行うための、標準的な数学関数が <cmath> ヘッダーに追加されました。 std::midp... -
【C++20】
ライブラリ | ビット演算の標準関数を徹底解説 はじめに ビット演算は、パフォーマンスが要求される場面や、低レベルのデータ操作で不可欠なテクニックです。従来は、ビットシフトや論理演算子を駆使して手動で実装する必要がありましたが、コードが複雑になり、環境依存の問題も発生しがちでした。 C++... -
【C++20】エンディアンを判定し、バイトオーダーを変換する方法 (std::endian, std::byteswap)
はじめに ネットワーク通信やバイナリファイルの読み書きなど、異なるシステム間でデータをやり取りする際、**エンディアン(バイトオーダー)**の違いが問題になることがあります。エンディアンとは、複数のバイトで構成されるデータをメモリ上に並べる順... -
【C++23】std::stacktraceでスタックトレース(関数呼び出し履歴)を取得する方法
はじめに プログラムのデバッグ中、特にエラーが発生した際に、「どの関数が、どの順番で呼び出されて、今の場所にたどり着いたのか」という呼び出し履歴を知りたい場面は非常に多くあります。この関数の呼び出し階層の情報を「スタックトレース」と呼びま... -
【C++20】Rangesライブラリ入門 | C++の新しいアルゴリズム操作
はじめに 従来のC++標準ライブラリ(STL)アルゴリズムは、sort(v.begin(), v.end()) のように、必ずコンテナのイテレータをペアで渡す必要がありました。これは冗長であり、end() を begin() と書き間違えるといった単純なミスも起こり得ました。 C++20で... -
【C++】イテレータ入門 | コンテナの要素にアクセスする汎用的な方法
はじめに C++の標準ライブラリ(STL)の中心的な設計思想の一つが、「アルゴリズム」と「コンテナ」の分離です。std::sortやstd::findといったアルゴリズムは、std::vectorやstd::listといった特定のコンテナに依存しません。 この両者の架け橋となるのが... -
【C++】コンテナオブジェクトを構築(生成・初期化)する様々な方法
はじめに C++の標準ライブラリが提供するコンテナ(vectorやmapなど)は、オブジェクト指向の基本に則り、オブジェクトを生成するためのコンストラクタを複数持っています。これにより、プログラマは状況に応じて最適な方法でコンテナを初期化できます。 ... -
【C++】コンテナに要素を追加する方法 (emplace_back, insert)
はじめに C++でvectorやmapなどのコンテナを扱う際、最も基本的な操作が「要素の追加」です。コンテナの種類によって、最適な追加方法が異なります。 この記事では、代表的な2つの要素追加方法を解説します。 emplace_back: vectorなどのシーケンスコンテ... -
【C++】挿入イテレータ (back_inserter 等) の使い方 | コンテナに要素を追加する
はじめに C++のstd::copyのようなアルゴリズムは、通常、既にある範囲の要素を上書きします。そのため、結果を格納する先のコンテナは、あらかじめ十分な大きさで確保されている必要がありました。 この問題を解決するのが「挿入イテレータ」です。挿入イ... -
【C++】コンテナの要素アクセス: .at() と [] の違いと使い分け
はじめに C++のstd::vectorやstd::mapといったコンテナに格納された要素にアクセスする際、よく似た2つの方法があります。 添字演算子 []: my_vector[5] や my_map["key"] のように、角括弧でアクセスする方法。 .at() メンバ関数: my_vector.at(5) や my_... -
【C++】コンテナの要素数を取得する3つの方法 (.size, std::size, std::ssize)
はじめに C++でvectorなどのコンテナを扱う際、そのコンテナに現在いくつの要素が格納されているかを知ることは、ループ処理やメモリ管理の基本となります。この「要素数」を取得するために、C++にはいくつかの方法が用意されています。 この記事では、要... -
【C++】vector等のコンテナのサイズを変更する.resize()の使い方
はじめに C++のstd::vectorやstd::listなどのコンテナを扱っていると、「要素数を後から増やしたい」「逆に、末尾の要素を削除してサイズを縮小したい」という場面があります。 このような、コンテナの**要素数(.size())**を直接変更するのが .resize() ... -
【C++】vector等のコンテナを空にする.clear()の使い方
はじめに C++でvectorやlist、mapなどのコンテナを再利用する際、「コンテナの中身を全て削除して、空の状態に戻したい」という場面は頻繁にあります。 forループで末尾の要素を一つずつ.pop_back()で削除していく方法もありますが、よりシンプルで効率的... -
【C++】コンテナが空かどうかを判定する.empty()の使い方 (sizeとの違い)
はじめに C++でvectorやstring、mapなどのコンテナを扱う際、「コンテナに要素が一つでも含まれているか、それとも空っぽか」を判定したい場面は非常に多くあります。 この判定には、.empty() というメンバ関数を使うのが、最もシンプルで推奨される方法で... -
【C++】コンテナの全要素に同じ処理を適用する std::for_each の使い方
はじめに C++で、「vectorに格納された全ての数値に10を足したい」「全ての文字列を画面に表示したい」といったように、コンテナの全要素に対して、同じ操作を一律に適用したい場面は非常に多くあります。 この記事では、この目的を達成するための2つの主... -
【C++】std::fill, fill_n でコンテナの要素を特定の値で埋める方法
はじめに C++でvectorなどのコンテナを特定の値、例えば 0 や -1 で初期化・リセットしたい場合があります。forループを使って一つずつ代入することもできますが、C++の標準ライブラリ <algorithm> には、このための専用関数が用意されています。 st... -
【C++】std::replace, replace_if でコンテナの要素を置換する方法
はじめに C++でvectorなどのコンテナを操作する際、「特定の値を持つ全ての要素を、別の値に置き換えたい」「特定の条件を満たす全ての要素を、別の値に置き換えたい」という場面は頻繁に発生します。 forループを書いて自力で実装することもできますが、C... -
【C++】std::reverse でコンテナの要素を逆順にする方法
はじめに C++でvectorなどのコンテナに格納された要素の並びを、完全に逆順にしたい(例: {1, 2, 3} → {3, 2, 1})場合があります。 この目的のために、標準ライブラリ <algorithm> には、std::reverse と std::reverse_copy という2つの便利な関数... -
【C++】std::shuffle でコンテナの要素をランダムにシャッフルする方法
はじめに C++で、カードゲームの山札を混ぜるように、vector などのコンテナの要素の並び順をランダムにしたい場合があります。 C++の標準ライブラリ <algorithm> には、このための std::shuffle という関数が用意されています。shuffle は、指定さ... -
【C++】std::sort / partial_sortでコンテナをソート(並べ替え)する方法
はじめに C++でvectorなどのコンテナに格納した要素を、昇順や降順に並べ替えたい(ソートしたい)場面は非常に多くあります。C++の標準ライブラリ <algorithm> には、このための非常に高速で効率的なソート関数が用意されています。 この記事では、...