koturnの日記

普通の人です.ブログ上のコードはコピペ自由です.

C++

C++におけるfinallyの実装

C++

はじめに この記事は世間では十分に議論され尽くしてきたC++におけるfinally句という話について書こうと思う. 「C++にはfinally無くて不便ですよね」という言葉は,実際にお仕事をしていて聞くことのある言葉なのだが,やはりC++初心者はfinallyが無い理由…

多次元の std::array を楽に扱う

C++

はじめに 前回の記事では,多次元の std::vector について書いた. 今回は多次元の std::array について書こうと思う. まず,std::array は組み込み配列と同等の機能を提供するクラスである(というより,組み込み配列のラッパークラスである). 使用方法…

多次元の std::vector を楽に扱う

C++

はじめに C++には std::vector という動的配列を扱うクラスが用意されている. このクラスはよく利用され,時には std::vector の std::vector,すなわち多次元の std::vecotr が用いられることがある. しかし,この多次元の std::vector は std::vector<std::vector<int>> v</std::vector<int>…

競技プログラミングとC++のアレコレ

C++

はじめに この記事は,C++初心者だけど競技プログラミングでC++を使っている,C++で競技プログラミングをやってみようと思っている人に向けた記事である. 「C++初心者」対象であって,プログラミングそのものが初心者である人向けではないかもしれない. な…

C++の配列・STLコンテナで区切り文字を入れてostreamに出力する

C++

はじめに C++において,たまに std:cout や std:ofstream, std::ostringstream といった出力ストリームに,配列や std::vector の要素を何かの区切り文字を入れて出力したいことがある. この「区切り文字を入れて出力」というのは少々面倒で,末端要素の後…

Range-based forで逆順走査したい

C++

はじめに C++を書いていると,Range-based forで逆順操作をしたいことがたまにある. Range-based forは順方向の走査のみで,逆順に走査することはできない. なので,通常のインデックスベースのforを用いて, std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}</int>…

C++のラムダで再帰する

C++

はじめに C++において,ラムダで再帰したいと考えることはたまにある. この記事ではラムダで再帰する手法をいくつか紹介する. 例として扱う再帰関数はフィボナッチ数列の関数(もっとも単純な実装)とする. int fib(int n) noexcept { return n < 2 ? n :…

IQ1を支えるコーディング術

この記事はIQが1Advent Calendarの10日目の記事になります. 昨日はMew_1406さんのIQ1と謝罪行脚と題された,怖いお話でしたね. はじめに ご存知の通り,僕はIQ1です. IQ1には様々な困難が存在します. 例えば,物が覚えられない.... 僕はプログラムを書…

OpenCLのオフラインコンパイル

はじめに OpenCLといえば,カーネルのコードに以下の2つのコンパイル方式がある. オンラインコンパイル オフラインコンパイル オンラインコンパイルは,実行時にOpenCLのカーネルコードを文字列として関数に渡し,プログラムオブジェクトを構築する手法であ…

MSYS2でOpenCLを使う

はじめに MSYS2でOpenCLのプログラムをコンパイル&実行したかった. pacmanでOpenCL関連のヘッダを導入することはできるが,OpenCLのインポートライブラリは導入することはできない. ここでは,MSYS2でOpenCLの環境を導入する一連の手順を紹介する. OpenCL…

std::vectorなどでアラインされた領域を用いる

はじめに 前回の記事でCPU SIMD命令(SSE/AVX/NEON)を紹介した. ただ,前回の記事では静的配列や単純な動的確保のパターンでしかアラインされた領域を用いる手法しか紹介しなかった. 今回は,C++でよく用いられるであろう std::vector でアラインされた領…

AVXとAVX-512のインタリーブ

C++

はじめに 前回の記事では,Intel系のCPUとARM系のCPUのSIMD命令紹介した. 記事中のサンプルコードで,画像の2倍の拡大を行うコードがあり,その中でインタリーブを行っていた. SSEであれば,単純にunpack命令を実行するだけでよかった. 簡単なサンプルコ…

SIMDの組み込み関数のことはじめ

はじめに 現代のCPUではSIMD(Single Instruction Multiple Data)命令を利用することができる. SIMD命令とはその名の通り,ひとつの命令で複数のデータを処理するものである. Intel系のCPUでは,MMX/SSE/AVX/AVX-512といったSIMD命令が利用可能であり,ARM …

CodeIQのスクエア・カルテット問題を解いた

はじめに CodeIQで@riverplus氏による「 スクエア・カルテット」問題 という,初等整数論を絡めた面白いプログラミングの問題があったので,それについての記事を書いた. 高校生の数学を思い出す良い問題であり,楽しかった. 問題 2つの自然数の組 $(a, b)…