142
150
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

2023年に特にお世話になったC++ライブラリ8選

Last updated at Posted at 2024-01-01

「雑に作れて、かなり速い」というC++の特性は私にとってとてもありがたいものです。
2023年も隙さえあればC++でコードを書かせてもらいました。

一般には古い言語と言われているC++ですが、今でも新しいライブラリや既存ライブラリの更新が活発にされています。

2023年のコーディングでお世話になったライブラリのうち「定番ではないけれど広範囲にとても役にたった」というライブラリをリストアップさせていただきました。
新しいライブラリをお探しの方のご参考になれば幸いです。

Glaze - JSONの読み書き

項目
ライブラリ種別 ヘッダオンリー
C++バージョン 20
ライセンス MIT
スター数 732
2023年リリース回数 67回

たぶん2023年一番お世話になったライブラリです。
2022年まではsimdjsonをよく使っていたのですが、新規プロジェクトはGlazeばかり使っています。
開発が活発だし、ISSUEへの対応が速いのもありがたいです。

良い点

  • SIMDを利用していないのにsimdjsonやyyjsonと遜色ない速度で動作する
  • 構造体やクラスだけでなくSTLコンテナもJSONとの直接読み書きができる
  • 中間データに独自バイナリ形式を利用してさらに高速化できる

いまいちな点

  • 長い文字列が多いJSONデータの読み込みではSIMDを使っているライブラリに対して不利になる
  • 最後のフィールドのカンマやコメントの読み込みに対応していない
  • ストリーム的な処理はない(と思う)

代替ライブラリ

似たようなアプローチでSIMDを使ってさらに速いJsonifierというライブラリがあります。
純粋な速度を求める場合にはこちらを使うことになりそうです。

commata - CSV読み書き

項目
ライブラリ種別 ヘッダオンリー
C++バージョン 17
ライセンス MIT
スター数 5
2023年リリース回数 8回

いまだによく使われるCSVファイルの読み込みで大活躍しました。

良い点

  • 一度に全部を読み込まず1行ずつに処理してくれる
  • ダブルクオート内の改行にも対応している
  • カスタマイズポイントが豊富で大抵の用途に対応できる

いまいちな点

  • マイナーすぎて不安
  • glazeみたいにstructにマッピングできるとうれしい

代替ライブラリ

アプローチがだいぶ違いますがsspも便利だと思います。

unordered_dense - std::unordered_map/setの代替

項目
ライブラリ種別 ヘッダオンリー
C++バージョン 17
ライセンス MIT
スター数 618
2023年リリース回数 15回

std::unorder_set, std::unorder_mapの代替となるライブラリです。
データの持ち方の工夫で、たいていの用途でほぼ同速度、用途によっては明確に高速動作してくれます。

良い点

  • 私が使っている限りではAPIは同一に使えていて、これのおかげで上のGlazeでのJSONとの読み書きにも対応しています
  • std::unordered_ma/setの代替として安定して使える

いまいちな点

  • hash関数はもっと高速なものが出てきているので、毎回定義が面倒になってきた
  • 順序を維持できるstd::map/setの代替が頻繁に欲しくなる

代替ライブラリ

Abseilfollyなどが提供するコンテナーも強力ですね。

Magic Enum C++ - 便利なenum

項目
ライブラリ種別 ヘッダーオンリー
C++バージョン 17
ライセンス MIT
スター数 4.1k
2023年リリース回数 6回

enumとenum classを便利にするユーティリティライブラリですね。
もう十分メジャーかもしれない…。

良い点

  • enumと文字列との相互変換を楽に実現できるし、変換する文字列を(日本語などの)独自定義もできる
  • enumでのflagの表現を手軽にできる機能がある

いまいちな点

  • 0.9.4でincludeパスが変わって変更が色々大変だった

代替ライブラリ

smart_enum, wise_enumがありますが、開発止まってしまってますね。

Quill - 高速多機能なログ出力

項目
ライブラリ種別 静的・動的ライブラリ
C++バージョン 17
ライセンス MIT
スター数 984
2023年リリース回数 17回

最近はほぼログ出力と言えばほぼ一択でこれを使っています。
開発も比較的活発でありがたいです。

良い点

  • ログがテキスト形式なものの中では高速に動作する
  • 柔軟なログ出力構成やログローテート設定が定義できる

いまいちな点

  • まだAPIが安定しておらず、細かい修正をしないといけないリリースがときどきあって泣ける

代替ライブラリ

他のライブラリだと機能の豊富さとAPIの安定ならばspdlog、高速な動作ならばfmtlogが良いと思います。

freexl - xls/xlsxファイルの読み込み

項目
ライブラリ種別 静的・動的ライブラリ
C++バージョン C言語
ライセンス GPL-2.0, LGPL-2.1, MPL-1.0
スター数 githubレポジトリ無し
2023年リリース回数 1回

まだまだ存在するxlsファイルを読み込めるライブラリです。
2023/07のリリースでxlsxファイルも読めるようになって読み込み全般に使えるようになりました。
ありがたい。

良い点

  • xls, xlsx, odsファイルを1つのライブラリで読み込める

いまいちな点

  • xlsxの読み込みは別の関数を呼び出す必要がある
  • xlsの読み込みが正しくない場合がある
  • 図やオブジェクトの読み込みには対応していない

代替ライブラリ

xlsファイルの読み込みに対応しているライブラリでメンテナンスされているものを知らないです。

libxlsxwriter - xlsxファイルの書き込み

項目
ライブラリ種別 静的・動的ライブラリ
C++バージョン C言語
ライセンス BSD-2-Clause
スター数 1.3k
2023年リリース回数 0回

freexlの逆でxlsxファイルへの書き込み用のライブラリです。
活発とは言えませんがメンテナンスされているし、クセはありますがC言語ライブラリでは唯一の機能を提供してくれています。

良い点

  • 数式やセルのマージ、オートフィルターなど大抵の機能が実現できる
  • 画像やグラフの書き込みができる
  • 巨大なファイルの書き込みへの対応機能がある

いまいちな点

  • シェイプ、スパークラインなどの最近の機能に対応していない (golangのexcelizeが羨しい)
  • セルは値とフォーマットを同時に設定しないといけない

代替ライブラリ

図やグラフが書けるC/C++ライブラリを他に見つけられていません。

blend2d - 高速なベクター画像描画

項目
ライブラリ種別 静的・動的ライブラリ
C++バージョン 11
ライセンス Zlib
スター数 1.4k
2023年リリース回数 9回

高速に動作する2次元ベクターグラフィックスライブラリです。
簡単なチャートを出したり、地図タイルに解析結果を描画したり、ちょっとしたデータの可視化にとても便利に使っています。

良い点

  • 綺麗な画像を高速に生成できる
  • FreeTypeに依存しない柔軟なフォント描画ができる

いまいちな点

  • 破線の曲線が(今のところ)描画できない
  • リリースが分かりづらい

代替ライブラリ

nanovgあたりが該当するのかなと思います。

終わりに

RustやGoに押されがちなC++ですが、未だに新しいライブラリも開発されてますし、C++17/20/23対応による既存ライブラリの使い勝手の向上も実感しています。
2024年も地味に進化してくれることを期待するばかりです。

わたしはconanパッケージを作成して少しでもお手伝いしようと思っています。

142
150
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
142
150