potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。

STL

C++20 標準ライブラリでUTF-16とUTF-32を変換する関数

C++標準ライブラリを使用してUTF-16とUTF-32を相互変換する関数のコードです。コンセプトにより制約するため、C++20以降用です。 u16_surrogate.hpp u16s_u32s.hpp テストコード u16_surrogate.hpp #pragma once namespace u16_surrogate { const char16_t h…

C++ Windows環境で絵文字のstd::iswgraphがfalseな理由の考察

VC++ではワイド文字列(L"...")に絵文字を含めることができます。この文字列に対してstd::iswgraphを適用しても戻り値はfalseです。 #include <string> #include <cwctype> #include <iostream> #include <iomanip> int main() { const std::wstring s{ L"" }; for (auto i = s.cbegin(); i != s</iomanip></iostream></cwctype></string>…

C++ UTF-16サロゲートペア判定とUTF-16/UTF-32文字列の相互変換

UTF-16サロゲートペア判定とUTF-16/UTF-32文字列の相互変換コードです。Unicodeの仕様はネット上の解説ページを参照しているため、間違えてる可能性もあります。 #include <algorithm> #include <string> namespace u16_surrogatepair { const char16_t high_surrogate_first =</string></algorithm>…

C++ std::multimap

標準ライブラリのSTLコンテナ、キーの重複を許すマップstd::multimap(以下multimap)についてのメモです。 初期化子リストによる初期化 要素数やキーに対応した値の個数の取得 要素の追加 あるキーを持つ要素の列挙 あるキーを持つ要素をまとめて削除 その…

C++20 生のポインタをstd::spanで扱う

std::spanでは生のポインタもSTLコンテナと同様に扱えます1。生ポインタの操作は通常推奨されませんが、WinAPIは連続したメモリ領域に異なる型を複数配置する場合があり、その場合に使用することになります。例えばFILESYSTEM_STATSTICS_EX構造体の直後にEXF…

C++20&WinAPI DeviceIoControl(FSCTL_FILESYSTEM_GET_STATISTICS_EX)のラッパークラス

C++20におけるWinAPIのDeviceIoControl(FSCTL_FILESYSTEM_GET_STATISTICS_EX)のラッパークラスです。ファイルは本体であるDeviceIoControlForFileSystemStatisticsExを定義するDeviceIoControlForFileSystemStatisticsEx.hpp、再利用可能そうなコードを集…

C++20 std::ranges::subrangeのメンバー関数使用例(Microsoft Visual Studio 2019 Community 16.9.0 Preview 3)

Microsoft Visual Studio 2019 Community 16.9.0 Preview 3におけるstd::ranges::subrangeのメンバー関数使用例です。 #include <ranges> #include <vector> int main() { std::vector v{ 0, 1, 2, 3, 4 }; // std::ranges::subrange r{ v }; std::ranges::subrange r(v.cbeg</vector></ranges>…

C++20 std::span、std::basic_string_view、std::ranges::subrangeの使い分け

C++20には所有権を持たず範囲を表すクラスとしてstd::span、std::basic_string_view、std::ranges::subrangeが用意されています。これらの概要は以下の通りです。 クラス 概要 std::span 連続したメモリ領域の部分を参照する。 std::basic_string_view 文字…

C++20 コンセプト関係のメモ

C++20のコンセプト関係のメモです。 std::destructibleはnoexcept(true)なデストラクタを持つクラスを含まない std::constructible_fromコンセプトはnoexcept(true)なデストラクタを持つクラスを含まない ある型が特定の型の引数から構築可能か調べる std::r…

C++17-20 文字列をある文字で分割した文字列ビューのベクターを作成する

C++で文字列をある文字で分割した文字列ビューのベクターを作成するコードです。コンセプトを使用したC++20以降用のコード、std::basic_string_viewを使用したC++17以降用のコードを記載しています。 C++20以降用のコード あまり使う機会はありませんがbasic…

C++&STL ワイド文字列の静的配列からstd::vector<std::wstring>を作成する

本文 C++でワイド文字列の静的配列(const wchar_t ...[];)からstd::vector<std::wstring>へ変換するにはstd::vector<std::wstring>のコンストラクタを使用します。引数には静的配列の(変換したい範囲の)最初と最後要素のアドレスを渡します。このコンストラクタはcpprefjpではイテレ</std::wstring></std::wstring>…

C++&WIL Windowsプロパティシステムのプロパティ情報を列挙する

C++20とWILでWindowsプロパティシステムのプロパティ情報を列挙するサンプルコードです。コードの変更でプロパティの他の情報も列挙できます。 コード 出力例 コード #include <iostream> #include <string> #pragma comment(lib, "propsys.lib") #define STRICT #include <Windows.h> #in</windows.h></string></iostream>…

C++20 レンジについて調べたこと

C++20のレンジについて調べたことの覚え書きです。 ここで扱うレンジ ここでは<ranges>ヘッダーで定義されるstd::ranges::range<T>コンセプトを満たす型をレンジとして扱います。range<T>の要件は型Tの変数tに対してstd::ranges::begin(t)とstd::ranges::end(t)が定義され</t></t></ranges>…

C++20 Rangesプロジェクションの動作確認用コード

動作確認用に作成したコードのメモです。以下のコードではstd::ranges::range<T>コンセプトを満たす型をレンジあるいはrange<T>として表記することもあります。 プロジェクションとは? range<optional<int>>の各要素の空判定を出力する。 range<optional<int>>の無効値を-1に変換して各要素を</optional<int></optional<int></t></t>…

C++17 STL variant、any、optional

C++にはintやdoubleといったC言語と共通の組み込み型(基本型)に加えてSTLの提供する型を使用できます。ここではSTLの提供する型のうち複数の型の値や無効値を一つの型としてまとめて扱う型variant、any、optionalを紹介します。 概要 variant any optional…

C++20 STLのrangeをvectorに変換する関数

C++20のコンセプトとrangesの学習用コードです。template <std::ranges::range T>のようにtypenameやclassの代わりにコンセプトを指定することで型Tをコンセプトで制限できます。コンセプトにrangeを指定すればrangeをvectorに変換する関数を定義できます。 template <std::ranges::range T>はrequiresで</std::ranges::range></std::ranges::range>…

C++ STLでwil::out_param相当の機能を実装する

STLにはWILのout_paramに相当する機能がおそらく存在しませんが、簡単な構造体またはクラスを作成すれば同等の機能を得られます。 STLコンテナにまとめて作成する場合 std::pointer_traitsを利用します。ただし、MSVCでstd::pointer_traitsにポインタ以外を…

C++11 STLの標準入出力にsetfill/setwをまとめて設定するヘルパー構造体&関数

はじめに C++とSTL(Standard Template Library)で標準(エラー)出力(std::cout、std::cerr)を使用して整数などを出力するとき、出力形式を指定するにはstd::hexやstd::setw/setfillといった関数を利用します。 このstd::setw/setfillは一度出力すると消…

C++11 STLで文字列から特定の文字を除去する

はじめに 文字列から文字を除去するには様々な方法がありますが,ここではC++11で導入されたラムダ式とSTLのremove_if,remove_copy_ifを組み合わせて文字を削除する方法を書き残しておきます.なお,MBCSとかだと扱えなくなるので別の処理が必要だと思いま…