C++

Rcpp内で日付(Date)を取り扱う

R C++

Rcpp内でDate型を取り扱いたいときにはDateVectorクラスを使用する。 ただ、 c++ - Subsetting Rcpp::DateVector using IntegerVector that contains indices? Operator [] overload - Stack Overflow によると、Rcpp内で日付を扱うためのDateVectorクラスは…

数値の頭に0を詰めて桁を揃える

C++

数値の頭に0を詰めて桁を揃える - My Life as a Mock Quant のC++版をやりたい。 #include <iostream> #include <iomanip> #include <string> #include <sstream> int main() { // 現状保存 std::ios::fmtflags curret_flag = std::cout.flags(); //123の頭に5個0を詰めて8桁にする std::ostrings</sstream></string></iomanip></iostream>…

C++/C言語の実行時間計測

C++

したい。 関数によってミリ秒だったり秒だったり、OSによって実時間だったりCPU時間だったりする点に注意。 #include <iostream> #include <vector> #include <chrono> #include <time.h> int main() { const int size = 1000 * 1000; //C++11版, ミリ秒単位、実時間ベース std::vector<int> x; auto</int></time.h></chrono></vector></iostream>…

数値→文字列をstd::to_string関数でなんとかする

C++

std::to_string関数、引数1個しかないので調整効かないのがあれだったがなんとかする。substrでいらんところを削って、小数点はXに置換しておいた。 #include <iostream> #include <string> #include <regex> int main() { const double pi = 3.1415926; std::cout << std::to_string(</regex></string></iostream>…

ERROR:invalid initialization of non-const reference of typeを直す

C++

Visual Studio(MSVC)からGCCに移植する際に食らったエラーメモ。 #include <iostream> template<class T_> int hoge(int value, T_ & x) { return x(value); } struct PlusOne { int operator()(int x){ return x + 1; } }; int main() { std::cout << "hoge: " << hoge(1, PlusO</class></iostream>…

C言語の関数ポインタを取るインターフェイスにRcpp::Functionを渡したい

R C++

最近だとtemplateの魔力を使ったC++を使えばこんなことする必要はないですが、古いC言語で書かれたライブラリなんかに、関数ポインタを引数として渡す必要がある場合のお話。以下のコードでは、関数ポインタ(typedef double(*Simulate)(double x))を引数にと…

線形代数ライブラリEigenの資料まとめ

C++

C++のテンプレートメタプログラミングを活用した線形代数ライブラリであるEigenに関連した資料へのLINKまとめ。 公式ドキュメント とりあえずここを探す。 Eigen: Main Page 特にクイックリファレンスガイド良く見る。 Eigen: Quick reference guide 講演資…

Rcppで定義するC++の関数に関数を渡すときはRcpp::FuncでOK

R C++

この辺 Calling R Functions from C++ http://dirk.eddelbuettel.com/papers/rcpp_intro_genentech_2015-01.pdf の例では1引数しか渡さないケースばかりだったので、複数引数の関数を渡せることに気がつかなかった。以下では適当な関数(someFunc)と、Rから…

Rcpp使ってパフォーマンスを測ったらに分類される…?

R C++

こういうどうでもいい関数があったとする。 hoge <- function(x) { result = x + 1; for(i in 1:10000000){ result <- result + 1; } result } この関数の実行速度+パフォーマンスを測るにはRprof関数を使って以下のように書く。 > Rprof(tmp <- tempfile())…

金融商品を記述するためのDSL(Domain Specific Language, ドメイン特化言語)っぽいもんをC++でやってみた(※元ネタ『Composing Contracts: An Adventure in Financial Engineering』)

はじめに の6章「金融取引契約の書き方」をC++でオレオレ実装するとどうなるのか?って話をしましょうという話を某氏としたのでやってみんとす。C++辛い、F#とかがよかった。 これは一体何? 金融商品を記述するためのDSL(Domain Specific Language, ドメイ…

カジュアルにC++11 in R

R C++

以下のプラグイン plugins=c("cpp11")をcppFunctionに指定するだけ。Winでもいけた。C++11なんで戻り値をdecltypeにしてやろうと思ったら、できなかった。windowsのgccが古いせいかな? library(Rcpp) cppFunction(' std::vector<double> twoTimes(std::vector<double> xs) {</double></double>…

意外に速いRタソ compared to C++

R C++

ちょいとRcppをがっつり使ってみようと、その試行錯誤記録が続く予定。 速度検証のテストコードとして、ランダムウォークする系列データを生成するコードを書いた。 library(Rcpp) sourceCpp(code=' #include<vector> #include <functional> #include <numeric> #include <Rcpp.h> using namespace</rcpp.h></numeric></functional></vector>…

std::shared_ptrを噛ませても、親クラスに子クラスのオブジェクト突っ込める

C++

「あれ?これOKだったっけ?」という話の確認で、具体的には「Baseを継承したDerivedのshared_ptrをBaseのshared_ptrに入れれたっけな?」という。 よく考えると、これが出来ないとshared_ptr使って動的多態できなくなるので、出来て当たり前か…↓サンプルコ…

autoとdecltypeで楽がしたい

C++

C++03の世界では、mapのiterator作ろうとするとこれえらい量を冗長な感じでタイプしなければならなかったが、C++11から導入されたdecltype使うとなんか…C++なのにふつくしい、そんなコードに思えてきたっつー話。 例えば std::map<int, std::string>::iterator getIterator(std</int,>…

適当なクラスにある特定のメンバーがあるかないかで処理を切り分ける

C++

c++ - Check if a class has a member function of a given signature - Stack Overflow に習う感じでやるのがよいか。SFINAE〜って奴です。 ここではToStringというintを引数にとってstd::stringを返すメンバーが任意のクラスにあるかないかで処理を切り分…

数値→文字列の変換はto_string関数で一発だ in C++11

C++

C++での「数値→文字列」の変換。 昔はstringstreamを使って数行コードを書いて変換しなきゃならんかったもんが、C++11だとto_string関数一発でいけるようになっていた。進化するC++ありがたい。 #include <iostream> #include <string> int main() { const std::string x = std</string></iostream>…

関数ポインタ、あるいはそれをテンプレートの特殊化で捌く時用のメモ

C++

鳥頭化がひどいのでメモっておこうって。 結論として function_traitsの特殊化で、「R_(Arg_)」と「R_(*)(Arg_)」は区別され、それはdecltype(hoge)なのかdecltype(&hoge)なのかに依る typeid関数に対しても&を付けてhoge関数を渡すか渡さないかで、void (__…

引数の型だけ違う(関数オブジェクト|関数)の処理をtemplateで切り分ける

C++

引数の型だけ違う関数オブジェクトの処理をtemplateで切り分ける−3 - My Life as a Mock Quant の続編。関数オブジェクトだけじゃなくて、関数でもOKにしてみた。ラムダ式でも動いた。関数ポインタが混ざってくると混乱する。 #include<iostream> #include<vector> #include<type_traits> /</type_traits></vector></iostream>…

関数ポインタと関数オブジェクト(ファンクタ)のどちらでも保有できるクラス

C++

すなおにこんなんでイケた。すぐ忘れるわぁ。Hogeにhoge関数でもMogeクラスのオブジェクトでもどっちでも入ると。 #include <iostream> template<class T_> struct Hoge { Hoge(const T_ & x) : x_(x){} double operator()(double x){return x_(x); } T_ x_; }; double hoge(doub</class></iostream>…

引数の型だけ違う関数オブジェクトの処理をtemplateで切り分ける−2

C++

記事のまとめ 続いたのでまとめておく。 引数の型だけ違う関数オブジェクトの処理をtemplateで切り分ける−1 - My Life as a Mock Quant 引数の型だけ違う関数オブジェクトの処理をtemplateで切り分ける−2 - My Life as a Mock Quant 引数の型だけ違う関数…

引数の型だけ違う関数オブジェクトの処理をtemplateで切り分ける−1

C++

記事のまとめ 続いたのでまとめておく。 引数の型だけ違う関数オブジェクトの処理をtemplateで切り分ける−1 - My Life as a Mock Quant 引数の型だけ違う関数オブジェクトの処理をtemplateで切り分ける−2 - My Life as a Mock Quant 引数の型だけ違う関数…

一様乱数と正規乱数

C++

C++11からboostなくてもよくなったんで、使い方メモっておく。正規分布に設定するパラメーターは平均と"標準偏差"であって、"分散"ではない点に注意。 あと、擬似乱数生成器をあえて値渡ししてるんだけど、内部で保有しているとおもわれる乱数の状態もコピー…

auto使うとラムダ書きやすい

C++

これでいいんだっていう。 #include <iostream> #include <functional> int main() { auto lambda = [](int x, int y) -> int { return x + y; }; auto f = std::bind(lambda, std::placeholders::_1, 10); std::cout << f(1) << std::endl; return 0; } 実行結果 11</functional></iostream>

Xを越える最初のコンテナの要素へのイテレーターを返す

C++

毎回関数オブジェクト使ってたんだけどlower_boundってのがあるんだなって。 lower_boundは"以上(>=)"なんだけど、"より大きい(>)"をやるには同様にupper_boundってのがあるのか。 #include <iostream> #include <vector> #include <algorithm> int main() { //適当なデータ std::vector<double> x</double></algorithm></vector></iostream>…

std::greaterとstd::lessの挙動がよくわからん

C++

あるクラスのオブジェクトが入ったコンテナを、そのクラスのメンバーの大小に応じて、ソートしたい、そんな時、あると思います。 だけど、書き方がよくわからんかったのでメモ。クラスの外に比較用のプレディケェード作れば楽ってのは知ってるのだが、こうし…

ダブル・ディスパッチを書いてみる

C++

意識しないで使ってそうだが、ダブル・ディスパッチ~ 典型的なオブジェクト指向プログラミング・イディオム ~にあるダブル・ディスパチをC++でメモっておく。 これは要するにif-else or switch的な処理で書いてしまいそうな所を、あるメソッド数呼び出しの…

Boostのlibファイルのリンクは自動で行われている

C++

Boost C++ Library プログラミングより unit_test、python以外のビルドが必要であったライブラリ(regex、thread、filesystemなど)は、Boostのヘッダ側で自動リンク設定がなされています。これらは、ヘッダを#includeすると自動でリンクの設定が行われるた…

vector中の特定の条件を満たす要素のインデックスだけを抽出

C++

vector中の特定の条件を満たす要素だけを抽出 - My Life as a Mock Quantで要素自身を抜いていたけど、 これが大きいオブジェクトだったらコピーコストが凄い事にと思うと夜も眠れないので、インデックスだけ抜くようにした…ら…ば…結構めんどい書き方になっ…

vector中の特定の条件を満たす要素だけを抽出

C++

まだC++03な私にはcopy_ifなんてないので、remove_copy_ifを使って代用。 すごく…めんどいです… #include<iostream> #include<vector> #include<algorithm> #include <functional> int main() { //テストデータ std::vector<int> x,y; x.push_back(1); x.push_back(3); x.push_back(4); x.push_back(5); x.p</int></functional></algorithm></vector></iostream>…

中括弧{}でスコープを絞る事ができるんですか、そうですか

C++

マジで最近まで知らなかった。 #include<iostream> int main() { { int x = 0; } std::cout << x << std::endl; return 0; } ↑というコードは error C2065: 'x' : 定義されていない識別子ですと怒られる。↓なら当然OK。 #include<iostream> int main() { int x; { x = 10; } std:</iostream></iostream>…