C++樹林– category –
-
【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> には、このための非常に高速で効率的なソート関数が用意されています。 この記事では、... -
【C++】std::count, std::count_if でコンテナの要素数を数える方法
はじめに C++でvectorなどのコンテナを扱う際、「指定した値と完全に一致する要素の数」や、「特定の条件を満たす要素の数」を数えたい場面は非常に多くあります。 forループで自力で数えることもできますが、C++の標準ライブラリ <algorithm> には... -
【C++】コンテナの要素を検索する方法 (find, find_if, map::find)
はじめに C++でvectorやmapなどのコンテナを扱う際、「特定の条件に合う要素を探し出す」という操作は、最も基本的な処理の一つです。C++の標準ライブラリは、この検索処理のために、効率的で汎用的なツールを提供しています。 この記事では、コンテナの種... -
【C++】std::transform でコンテナの全要素を変換する方法
はじめに C++で、「vectorに格納された数値全てを2倍したい」「文字列のリストを全て大文字にしたい」といったように、コンテナの各要素に同じ変換処理を加え、その結果を新しいコンテナに格納したい場面は非常に多くあります。 forループを書いて一つずつ... -
【C++】vector等から要素を削除する様々な方法を徹底解説
はじめに C++のコンテナ(vector, list, mapなど)を操作する上で、「特定の要素を削除する」という処理は非常に頻繁に発生します。C++には、この削除処理を行うための様々な方法が用意されており、状況に応じて最適なものを選択することが重要です。 この... -
【C++】vector等から重複した要素を削除する std::unique の使い方
はじめに C++で、vector などのコンテナから、重複している要素を全て取り除き、ユニークな(一意な)要素だけの状態にしたい、という場面は頻繁にあります。 この目的のために、標準ライブラリ <algorithm> には std::unique という関数が用意され... -
【C++】all_of, any_of, none_of | コンテナの要素が条件を満たすか判定する方法
はじめに C++で、コンテナ(vectorなど)の全要素をチェックして、「全ての要素が正の数か?」「少なくとも一つ偶数が含まれているか?」「負の数は一つも含まれていないか?」といった条件を判定したい場面はよくあります。 forループとif文でこれらのロ... -
【C++】min_element, max_elementでコンテナの最小値・最大値を取得する方法
はじめに C++で、vector などのコンテナに格納された要素の中から、最小値や最大値を探し出したい、という場面は非常に多くあります。自前でループを書いて探すこともできますが、C++の標準ライブラリ <algorithm> には、このための専用関数が用意さ... -
【C++】std::accumulate でコンテナの合計値などを計算する方法
はじめに C++で、vector などのコンテナに格納された全要素の合計値を求めたい場合、forループを使って一つずつ足し合わせていくのが基本的な方法です。しかし、このような典型的な集計処理のために、標準ライブラリ <numeric> には、より簡潔で意図... -
【C++】std::set_union 等 | 2つのソート済みコンテナで集合演算を行う方法
はじめに 数学で学ぶ「集合」の考え方(和集合、積集合、差集合など)は、プログラミングにおいても、2つのデータセットを比較・合成する際に非常に役立ちます。 C++の標準ライブラリ <algorithm> は、これらの集合演算を効率的に行うための、以下の... -
【C++】std::next_permutation ですべての順列を生成する方法
はじめに プログラミングでは、{A, B, C} という要素の集まりから、{A, C, B}, {B, A, C}, {B, C, A} といった、考えられる全ての並び順(順列)をリストアップしたい場面があります。 C++の標準ライブラリ <algorithm> には、この順列生成を簡単に... -
【C++】vectorやstringのデータへ直接アクセスするポインタを取得する方法 (.data, .c_str)
はじめに C++のstd::vectorやstd::stringは、内部的に連続したメモリ領域(配列)を使ってデータを管理しています。通常、これらのコンテナの要素には .at() や [] 演算子でアクセスしますが、時には、C言語スタイルの古い関数(printf や memcpy など)と... -
【C++】vectorのメモリを事前確保するreserve()の使い方(パフォーマンス改善)
はじめに C++の std::vector は、要素を追加 (push_back) していくと、内部のメモリ領域(キャパシティ)が足りなくなった時点で、より大きな新しいメモリ領域を確保し、そこに全要素をコピーするという「メモリの再確保」を自動で行います。 この再確保は... -
【C++】vectorの余分なメモリを解放する shrink_to_fit() の使い方
はじめに C++の std::vector は、要素が追加される際に、効率化のために実際の要素数よりも少し多めにメモリを確保します。これにより、push_back のたびにメモリ確保が走るのを防ぎ、パフォーマンスを向上させています。 vectorが現在保持している要素の... -
【C++】views::iota で連続した数値(数列)を生成する方法
はじめに プログラミングでは、「1から10までの数」や「0から始まる10個の数」といった、連続した数値のシーケンスを使ってループ処理を行いたい場面が頻繁にあります。従来は、for (int i = 1; i <= 10; i++) のように、forループの初期化式・条件式・... -
【C++】std::span の使い方 | 配列やvectorの一部を安全に参照する方法
はじめに C++で、関数に配列の一部を渡したい場合、従来はポインタとサイズをペアで渡す必要があり、バグが発生しやすいという問題がありました。 C++20で導入された std::span は、この問題をエレガントに解決します。spanは、連続したメモリ領域への「ビ... -
【C++】Rangesライブラリ入門 | take, drop, filterで要素を抽出する方法
はじめに C++で、コンテナ(vectorなど)から「最初の3要素だけ」や「偶数の要素だけ」を取り出したい場合、従来は手動でforループとif文を組み合わせる必要がありました。 C++20で導入されたRanges(レンジ)ライブラリは、このようなデータシーケンスの... -
【C++】自作クラス/構造体を std::map や std::set のキーにする方法
はじめに C++のstd::setやstd::mapは、キーの大小関係に基づいて、内部のデータを自動的にソートします。intやstringのような基本型は、a < b のように、コンパイラが比較方法を知っているため、そのままキーとして使えます。 しかし、自作したProduct... -
【C++】mapやsetを効率的に併合する.merge()の使い方
はじめに C++で、二つのmapやsetといった連想コンテナを一つにまとめたい場合、従来は片方のコンテナの全要素をループで取り出し、もう片方に一つずつinsertする必要がありました。この方法では、要素のコピーや、場合によってはメモリの再確保が発生し、... -
【C++】views::zip で複数のコンテナを同時にループさせる方法
はじめに プログラミングでは、「商品IDのリスト」「商品名のリスト」「価格のリスト」のように、それぞれ別のコンテナに格納されているものの、インデックス番号が対応している複数のリストを同時に扱いたい、という場面が頻繁にあります。 従来、このよ... -
【C++】views::cartesian_productで全組み合わせループを簡潔に書く方法
はじめに プログラミングでは、複数のリストの要素をすべて組み合わせたパターンを網羅したい、という場面がよくあります。例えば、「サイズ(S, M, L)」と「色(赤, 青)」の全組み合わせ(S-赤, S-青, M-赤, ...)を処理するようなケースです。 従来、... -
【C++】views::enumerate でインデックス付きforループをスマートに書く方法
はじめに C++の範囲for文 (for (auto item : items)) は、コンテナの全要素を簡潔にループ処理できる非常に便利な機能です。しかし、ループの中で「今が何番目の要素か」というインデックス番号も同時に使いたい場合、従来はループの外でカウンター変数を... -
【C++】std::thread の使い方 | スレッドを作成して関数を並行実行する方法
はじめに C++11以降、標準ライブラリ <thread> を使うことで、マルチスレッドプログラミングが言語レベルでサポートされるようになりました。これにより、重い計算処理などをバックグラウンドで行わせ、その間にユーザーインターフェースは応答可能... -
【C++】スレッドに引数を渡す3つの方法(値渡し、参照渡し、ムーブ)
はじめに C++の std::thread を使って新しいスレッドを起動する際、そのスレッドで実行される関数に、メインスレッドから何らかのデータを渡したい場合がほとんどです。 std::thread のコンストラクタは、2番目以降の引数として、スレッドで実行する関数に... -
【C++】スレッドを安全に停止させる方法 (jthread と stop_token)
はじめに マルチスレッドプログラミングにおける難しい課題の一つが、「スレッドを安全に、かつ綺麗に停止させる」ことです。旧来のstd::threadでは、スレッドを外部から中断させるための標準的な仕組みがなく、複雑な実装が必要でした。 この問題を解決す... -
【C++】std::thread::join() の使い方 | スレッドの終了を待機する方法
はじめに C++で新しいスレッドを起動すると、そのスレッド(ワーカースレッド)は、呼び出し元のスレッド(メインスレッド)とは並行して動作します。そのため、メインスレッドがワーカースレッドの処理完了を待たずに先に終了してしまうと、ワーカースレ... -
【C++】std::thread::joinable() の使い方 | スレッドが合流可能か判定する方法
はじめに C++の std::thread オブジェクトは、生成されると特定のスレッドの実行を管理します。この thread オブジェクトに対して、スレッドの終了を待つ .join() や、スレッドを切り離す .detach() を呼び出すと、オブジェクトはスレッドの管理を手放し、... -
【C++】std::thread::detach() の使い方 | スレッドを切り離してバックグラウンド実行する方法
はじめに C++の std::thread でスレッドを起動した後、通常はそのスレッドが終了するのを .join() で待つ必要があります。しかし、「一度起動したら、あとはバックグラウンドで処理が終わるまでお任せしたい。メインスレッドは待たずに先に進みたい」とい...