p_tan's blog

勉強日記です。ツッコミ大歓迎

C++

COM構造化ストレージの IStream 生ポインタを C# 側に引き渡す

COM の構造化ストレージのストリームインターフェースであるIStream を生ポインタで持っているとして、 それをC#側からアクセスしたい時。 .NET には、ネイティブのIStream インターフェースに対応する System.Runtime.InteropServices.ComTypes.IStream が…

C++/CLIのdllからネイティブ関数をエクスポートする際の注意事項

C++のネイティブdllの.vcxprojなら、プロジェクト参照に入れればインポートライブラリ(.lib)を自動でリンクしてくれる。 しかし、C++/CLIのdllからネイティブ関数やネイティブクラスをエクスポートする際、使う側からプロジェクト参照してもインポートライブ…

複数の.vcxproj間で特定のパスを共有する方法

環境 Visual Studio 2017 C++開発 やりたいこと 巨大なコードベースでVC++のソリューションを分けて開発している時に、すべての .vcxproj でルートディレクトリのパスを共有したい ** 出力ディレクトリやINCLUDEパスなど ただし、環境変数は使いたくない。レ…

CoTaskMemAllocのリークをIMallocSpy で検知する

C++

MSVCでメモリリークチェックと言えば、CRT ライブラリを使用したメモリ リークの検出 が定番ですが、これだとCランタイム経由じゃない CoTaskMemAlloc, CoTaskMemReallocで確保したメモリのリークは検知できません。 そこで IMallocSpy interface (COM) を使…

PODクラスのデフォルトコンストラクタとメンバ変数をprivateにすることでクラスの不変条件を担保する

C++でCと互換性のあるデータ型を使いたい場合は、POD(Plain Old Data)型としなければならない。 C++11 でPODクラスの要件が緩和されたので、PODクラスのメンバ変数やdefaultコンストラクタをprivate に定義できるようになった。 これにより、PODクラスでもコ…

const参照引数でハマった

C++

const参照の引数でうっかりしてハマったこと。以下のような、レンジの全ての要素から、一括してある値を引くようなヘルパ関数を作っていた。 (実際は足し算や掛け算などもサポートするように汎用的に書いていたが) template<class T, class Range> void Sub(Range &r, const T& v</class>…

データメンバに触らなければヌルポインタの参照外しを行なっても実行時エラーにならない

C++

恥ずかしながら知らなかった。 ヌルポインタの参照外しを行ったらすぐにセグメンテーションフォールト等で落ちるもんだと思い込んでたけど、データメンバに触らなければ実行できてしまうようだ。 規格上認められてるのか、それとも未定義動作なのか。 #inclu…

autoを使おう

GoingNative 2012のスライドを眺めていたらびっくりしたのでメモ。 STL11: Magic && Secrets | GoingNative 2012 | Channel 9のスライド24枚目。 map<string, int> m; for(const auto& p1 : m) for(const pair<string, int>& p2 : m) このfor文、どっちが速い?って問い。答えは上の方</string,></string,>…

EigenでNMF

C++

C++の行列演算ライブラリEigenを使うとNMFが超簡単に実装できる。 Eigen http://eigen.tuxfamily.org/index.php?title=Main_Page NMF : Non-negative Matrix Factorization Wikipediaとか、この文献見るといいです。 Daniel D. Lee and H. Sebastian Seung (…

constexpr関数とstatic_assertでコンパイル時ユニットテスト

constexprな関数はstatic_assertでコンパイル時にユニットテストできる。 // ユークリッド互除法による最大公約数 constexpr int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } // constexprな関数gcdのユニットテスト static_assert(gcd(1, 1)…

Boost.Iteratorでfizzbuzz_iterator

Boost.Iterator のtransform_iteratorとcounting_iteratorを使ってfizzbuzz_iteratorを作ってFizzBuzzを解いてみた。http://ideone.com/5nAWjそれだけ。

POD型の初期化

C++

参考サイト C++における構造体の初期化 | 株式会社きじねこPOD(Plain Old Data)型の初期化には集成体(aggregate)用の{}による初期化とは別に値初期化というものが使えるらしい。 以下VC++2005 Express Editionの実行結果と共に。 #include <vector> #include <iostream> // POD</iostream></vector>…

整数型か浮動小数型かで四捨五入するかどうか分岐する関数テンプレート

C++

こんな関数テンプレートがあったら使い所があるかも。 #include <cassert> // RetTypeが整数型の場合は四捨五入した値を返し、 // RetTypeが浮動小数型の場合はそのままの値を返す。 template<typename RetType, typename ArgType> RetType IfIntegralThenRound(ArgType val) { return static_cast<RetType>(val + 0</rettype></typename></cassert>…

汎用LessBy

C++

小さなクラスを特定のメンバの値を基準にしてソートしたい場合。 しかも、Boost.MultiIndexを使うのは大げさだなーという時。 C++11ならラムダ式で書けるが、それでもめんどくさい。 例: class X{ int a; double b; public: // ...コンストラクタとか... in…

C++のwchar_t型について

C++

参考 日本工業標準調査会:データベース検索-JIS検索でプログラム言語C++を検索 ワイド文字 - Wikipedia charとUnicodeとワイド文字をごっちゃにしないために wchar_t ワイド文字を表す型 規格ではサイズは16bitとは限らない 規格では内部表現の規定がないの…

boost::thread::timed_join

thread::timed_join : joinの時間指定版 指定時間待ってもスレッドが終わらなければfalseを返す。 #include <boost/thread.hpp> void worker() { printf("worker start.\n"); int c = 0; for(int i = 0; i < (1 << 30); i++){ c++; } printf("worker end.\n"); } int main() {</boost/thread.hpp>…

EventVisitorを複数指定する

std::make_pairまたはboost::make_listを使う boost::make_listはネストされたstd::pairを返す #include <iostream> #include <utility> #include <boost/graph/graph_utility.hpp> // for boost::make_list #include <boost/graph/adjacency_list.hpp> #include <boost/graph/breadth_first_search.hpp> using namespace boost; using name…</boost/graph/breadth_first_search.hpp></boost/graph/adjacency_list.hpp></boost/graph/graph_utility.hpp></utility></iostream>

Visitorの使い方

参考 Boost Graph Library: Visitor Concepts Visitorとは グラフアルゴリズムを拡張するためのコールバック関数の集まり 使用例)幅優先探索アルゴリズムで訪れる順に頂点を出力する、等 各グラフアルゴリズムに対してVisitorコンセプトが定義されている Vi…

グラフアルゴリズムの使用方法:ダイクストラの最短パスアルゴリズム

グラフアルゴリズムの使用例としてダイクストラの最短パスを使う。以下サンプルコード #include <iostream> #include <boost/graph/graph_traits.hpp> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/dijkstra_shortest_paths.hpp> #include <boost/property_map/vector_property_map.hpp> #include <boost/foreach.hpp> using namespace std; us…</boost/foreach.hpp></boost/property_map/vector_property_map.hpp></boost/graph/dijkstra_shortest_paths.hpp></boost/graph/adjacency_list.hpp></boost/graph/graph_traits.hpp></iostream>

グラフアルゴリズムを使うための予備知識

参考 Quick Tour of Boost Graph Library Boost Graph Library: Named Parameters グラフアルゴリズムを使うための予備知識 グラフアルゴリズムはそれぞれ関数で提供されている。 例:深さ優先探索→depth_first_search() グラフアルゴリズムにはグラフオブジ…

プロパティとプロパティ・マップ2

前回の続き。 参考 Quick Tour of Boost Graph Library Boost Graph Library: Using Property Maps 内部プロパティ(adjacency_matrix) adjacency_matrixの内部プロパティもテンプレート引数で指定する。 typedef adjacency_matrix<undirectedS, property<vertex_index_t, int>, // vertex property prope</undirecteds,>…

プロパティとプロパティ・マップ

参考→Quick Tour of Boost Graph Library, Boost Graph Library: Using Property Maps, グラフの辺や頂点にプロパティ(重みや名前、色などの情報)を付けるためにはプロパティ・マップを使う。 プロパティの管理方法には2種類ある 内部プロパティ:グラフ・…

グラフ・インタフェイスについて

参考→Boost Graph Concepts 要点と考えたこと: データ構造とアルゴリズムの独立性を高めるためにインタフェイスを通じてグラフのデータへアクセスする グラフのデータ:頂点、辺、ある頂点の隣接頂点や接続辺など インタフェイスの条件を満たすような自作の…

グラフの型と基本的な操作2

グラフの型と基本的な操作 - p_tanのお勉強日記の隣接リストに続いて隣接行列。 参考サイト↓ Boost Graph Library: Adjacency Matrix(日本語) Boost Graph Library: Adjacency Matrix - 1.43.0(英語) adjacent_matrix サンプルコード。 #include <iostream> #inclu</iostream>…

グラフの型と基本的な操作

はてダ始めてみました。 Boost Graph Libraryについて勉強したことを書いていきます。 参考サイト↓ Table of Contents: Boost Graph Library - 1.43.0(英語) Table of Contents: Boost Graph Library(日本語)グラフ理論に関する基本的な知識はあるものと…