mori– Author –
-
Pythonの入れ子辞書:複雑なデータを構造化する方法
Pythonの辞書はキーと値のペアを格納しますが、その「値」としてさらに別の辞書を格納することもできます。このようにデータ構造の中に同じ種類のデータ構造が入っている形を**入れ子(ネスト)**と呼びます。 入れ子辞書を使うと、より複雑で階層的なデー... -
Pythonで三目並べを完成させよう:勝利判定と入力チェック機能付き
Pythonの基礎を学んだら、その知識を組み合わせて実際に動くものを作ってみたくなりますよね。**三目並べ(Tic-Tac-Toe)**は、辞書、関数、ループといった基本的な要素をすべて活用するのに最適なプロジェクトです。 この記事では、シンプルな三目並べゲ... -
Pythonのpprintモジュールで辞書やリストを綺麗に表示する方法
Pythonでリストや辞書、特にネストされた(入れ子構造の)複雑なデータ構造を扱う際、print()関数でその内容を確認しようとすると、すべてのデータが一行で表示されてしまい、非常に読みにくいことがあります。 このようなデータを、人間が読みやすいよう... -
Python辞書のsetdefault()メソッドでキーの初期値を設定する方法
Pythonで辞書を扱う際、「もしキーが存在しなかったら、デフォルト値(初期値)を設定する」という処理は非常によくあるパターンです。通常、これはif文を使って書くことができます。 # 設定を管理する辞書 config = {"user": "admin", "level": 5} # "the... -
Python辞書のget()メソッド:KeyErrorを回避して安全に値を取得する方法
Pythonで辞書を扱う際、存在しないキーを指定して値を取り出そうとするとKeyErrorが発生し、プログラムが停止してしまいます。これを防ぐためのエレガントな方法が、辞書の**get()メソッド**です。 この記事では、get()メソッドの基本的な使い方と、角括弧... -
Python辞書:キーや値が存在するかを安全にチェックする方法
Pythonで辞書を扱う際、存在しないキーにアクセスしようとしてKeyErrorというエラーに遭遇するのは、初心者がよく経験することです。このようなエラーを防ぐためには、処理を行う前にキーや値が辞書に存在するかどうかを事前に確認することが重要です。 こ... -
Python辞書のkeys(), values(), items()メソッドの使い方
Pythonの辞書はキーと値のペアでデータを格納しますが、これらのデータをループ処理で一つずつ取り出したい場面は非常に多くあります。そのために、辞書には**keys()、values()、items()**という3つの便利なメソッドが用意されています。 この記事では、こ... -
Pythonの辞書入門:リストとの違いと基本的な使い方
Pythonには、複数のデータをまとめて管理するための強力なデータ型としてリストがありますが、それとは異なる方法でデータを整理する**辞書(dictionary)**というデータ型も存在します。 リストが**順番(インデックス)でデータを管理するのに対し、辞書... -
【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() で待つ必要があります。しかし、「一度起動したら、あとはバックグラウンドで処理が終わるまでお任せしたい。メインスレッドは待たずに先に進みたい」とい... -
【C++】std::this_thread::yield() | 他のスレッドにCPUを明け渡す方法
はじめに マルチスレッドプログラミングにおいて、あるスレッドがループの中で、特定の条件が満たされるのをひたすら待ち続ける(ビジーウェイトまたはスピンロック)ような実装を行うことがあります。しかし、このような実装は、CPUリソースを無駄に消費... -
【C++】スレッドを一時停止(スリープ)する方法 (sleep_for, sleep_until)
はじめに マルチスレッドプログラミングでは、特定のスレッドの実行を、意図的に一定時間だけ**一時停止(スリープ)**させたい場面がよくあります。例えば、定期的に処理を実行したり、他のスレッドとのタイミングを調整したりするケースです。 C++の標準... -
【C++】std::thread::hardware_concurrency() で最適なスレッド数を取得する方法
はじめに マルチスレッドプログラミングで処理を並列化する際、「一体いくつのスレッドを立ち上げるのが最も効率的なのか?」という問題に直面します。スレッド数をやみくもに増やしても、CPUコア数以上のスレッドは、結局のところCPU時間を奪い合うだけに... -
【C++】std::mutex の使い方 | スレッド間の排他制御で競合を防ぐ方法
はじめに マルチスレッドプログラミングでは、複数のスレッドが、グローバル変数のような共有リソースに同時にアクセスして値を変更しようとすると、データ競合(レースコンディション)が発生し、プログラム全体の整合性が壊れてしまいます。 例えば、あ... -
【C++】std::shared_mutex の使い方 | 読み取りのパフォーマンスを向上させる方法
はじめに マルチスレッドプログラミングにおいて、共有リソースへのアクセスを std::mutex で保護すると、読み取りと書き込みの両方が排他的になります。しかし、「書き込みはほとんど発生せず、大半が読み取り」という状況では、本来同時に実行できるはず... -
【C++】std::lock_guardとstd::unique_lockの使い方 | mutexを安全に管理する方法
はじめに マルチスレッドプログラミングでは、複数のスレッドが同じデータ(共有リソース)に同時にアクセスすると、データが破壊されたり、予期せぬ競合状態が発生したりする問題があります。これを防ぐのが、std::mutex(ミューテックス)を使った排他制... -
デッドロックを回避!複数のリソースを安全にロックする方法
複数のスレッドが動作するプログラムにおいて、2つ以上の共有リソース(データ)を同時に操作する必要があるケースは少なくありません。例えば、ある銀行口座から別の口座へ送金する処理などがこれにあたります。 このような処理を単純に実装すると、デッ... -
ロックからの解放:atomicによる高速な排他制御入門
スレッド間でデータを安全に共有するための最も一般的な方法はMutexによるロックです。しかし、ロックはスレッドの待機(ブロッキング)を引き起こす可能性があり、パフォーマンス上のボトルネックになることも少なくありません。 この記事では、ロックを...