C++
頭出し 共変(covariant)戻り値について。 これを知らないと、たとえばオブジェクトのコピーを作成するcloneメソッドは以下のように書いてしまうわけですが、 これやっちゃうと、clone後、処理によってはいちいち基底型をdynamic_castして、NULLチェックして…
関数のオーバーロードを使用する際に、うまくコンパイルできないケースをエラーとするのではなく、オーバーロードの対象から自ずと外してしまうという技法((技法というよりもコンパイラとしてこのような動作となるか否かって話っぽい))。以下の例の場合はte…
問題 オブジェクトの深いコピーを作る時は、コピーコンストラクタを内部で呼び出してnewするようなclone関数を作成するのがセオリーだと思い、以下のように書くわけです。 #include <iostream> //適当なクラス class Hoge { public: Hoge* clone(){return new Hoge(*th</iostream>…
sstreamのstringstream使えばいいんだろうけど、こっちの方がタイプ量的に楽。 あとはboost::lexical_cast使えないちゃんの時のために。 #include <iostream> #include <vector> #include <algorithm> //文字列⇒小数の変換ファンクタ struct ToDouble{double operator()(std::string x){re</algorithm></vector></iostream>…
特に意味があるわけではないけれども、こんな感じか*1。 library(inline) src <- ' Rcpp::Rcout << "Hello, world" << std::endl; ' f <- cxxfunction(signature(), src, plugin="Rcpp") f() 実行結果 > f() Hello, world NULL 参考 Using Rcout for output …
「数値計算をC++っぽく書く場合、速度的な事を考えるといちいち仮想関数テーブルを漁りにいかないのでテンプレートの方が速いんだろうな」と思っていたが、例のごとく億劫がってやってなかったので、やってみましたよというお話。結論としてはテンプレートを…
これもまた良く忘れるのでメモ。 以下のようにチョイスするのが効率的。 連続メモリコンテナ系(vector, deque, string etc):erase + remove リスト(list):remove 連想コンテナ系(set, map etc):erase 以下例、「1,2,3,3,5」という要素を格納する各コン…
STLのvectorにおいて一度reserveされてしまった容量(not サイズ)を削除するための技法。 単純にreserveを再度実行しても要領は削減されないので - std::vector(x).swap(x) と書く。 #include <iostream> #include <vector> int main() { std::vector<int> x; for(int i = 0; i < 1</int></vector></iostream>…
std::uniqueするときはstd::sotrしてからじゃないと正しくならない点に注意せんといかん。unique_copyでも似たようなコード書ける。 #include <iostream> #include <algorithm> #include <vector> int main () { std::vector<int> v; v.push_back(0); v.push_back(1); v.push_back(2); v.push_b</int></vector></algorithm></iostream>…
構造体をVBA(Excel)からC++に投げつける際には、データのメモリへの詰め込まれ方、アライメント(VC++デフォルト8バイト・VBA4バイト)に注意せんといかんわけです。 これを成し遂げるために今までは【プロジェクトのプロパティ】→【C/C++】→【コード生成…
昇順・降順ともに一旦ベクトルの値をindex-valueでペア化して、それをソート(ここではpartial_sort)するような関数(ここではlessPair, greaterPair)を用意すればOK。 ここではベクターの上位二番目の位までを降順並び替え。 #include <vector> #include <algorithm> #includ</algorithm></vector>…
生のstl vectorをNumericMatrixに突っ込もうとすると怒られた、一方、一旦Rcpp::NumericVectorを経由させたらイケた。 以下、サンプル。行・列ごとの代入もラクラクで便利。 library(Rcpp) library(inline) src <- ' std::vector<int> x(2,111); NumericMatrix xx</int>…
これも良く忘れるのでメモん。例えば最大の要素自体はmax_elementで取得できるんだけど、それのindex番号が欲しい時の書き方。iteratorの初めとのdistanceを取ればよい。別に最大要素のiteratorじゃなくても良くて適当なiteratorとのdistanceしてやればいい…
時折ド忘れするのでメモ。 要するにtransform + toupper(tolower)の組み合わせが一番楽に出来るぞと。 #include <iostream> #include <string> #include <algorithm> int main() { std::string x("abCdef"); std::transform(x.begin(), x.end(), x.begin(), ::toupper); std::cout << x; r</algorithm></string></iostream>…
クラスの中にクラスを書けることはpimlなんかを通じて知っていたのだが、関数の中にもローカルにクラスを定義出来ることは知らなかったのでメモ。ファンクタとか使うのに便利そう。 #include<iostream> void hoge() { class Hoge { public: void Shout(){std::cout << </iostream>…
ふつーにテンプレート使って型に応じた処理をオブジェクト指向っぽく書くと、静的にポリモーフィズムれるんだけど、そのほかにも掲題の「タグ・ディスパッチ」って手法もあるらしい。 タグ付けして処理をグルーピングさせるために使うイメージ。有名所だとST…
基本 RStudio and Rcpp | RStudio Blog を見ればよろしい。 私は環境を更新するついでに、Rに関して一旦全部更地にしてから行った(windows7 64bit)。 まずR本体・Rtools(C++のコンパイラとかが入っている)・RStudioそれぞれを以下よりインストール R本体(2…
普通にやると出来ない。回避策は二つ templateの特殊化 クラスの変換演算子 #include <iostream> #include <string> using namespace std; //templateの特殊化で対応 template <class T> T SameTypeReturn(); template <> double SameTypeReturn(){return 4.4;} template <> string Same</class></string></iostream>…
たまに必要になるんだけど、毎回書き直しているのでメモっておく。 テストコードの結果はR言語と揃ってるのは確認済。 #include <iostream> #include <cmath> #include <vector> #include <list> #include <numeric> template <template<class T, class Allocator = std::allocator<T> > class Container> double mean(Container<double> & x) { return std::accumula</double></template<class></numeric></list></vector></cmath></iostream>…
ポインタだと混乱しないけど、参照だとよく頭がごっちゃになるのでメモっとく。 受取/関数 値返し 参照返し 値 ○ ○ 参照 ○ × (コピーコンストラクタが発動するケース○・しないケース×) 結局オブジェクトのコピーを作りたくないときは”参照戻し”の関数から…
Interpreter pattern - Wikipedia DSL(Domain Specific Lanuage、ドメイン特化言語)を作るときに良いっぽい。要するにAST(Abstract Syntax Tree)を作るときに使うイメージかな?以下のコードは例の如くwikipediaにあったコードをC++に書きなおしたもの。サ…
式構造自体を保存し、必要な際に評価するための枠組み。「Expression Template」でググると色々例が出てくるが、大体行列・ベクトルを扱ったものばかりなので、がんばって”スカラー”評価をする用のクラスを書いてみた。正しくなさげ・最適化の余地ありだと思…
型変換演算子を使うとC++の言語使用でサポートされていない「戻り値の型によるオーバーロード」を実現することができる。以下のコードではstruct X内にA・Bの両型での型変換演算子を用意しているのがミソ。 #include<iostream> using namespace std; //戻り値の型 stru</iostream>…
型変換演算子(Type conversion operator)をオーバーロードして特定の型へのキャストを実現できる。以下では適当に作ったPointer(ポインタ)型クラスのオブジェクトをNULLポインタのときにfalseが返るようにbool型へキャストしている。 #include<iostream> using name</iostream>…
templateを使って静的に(コンパイル時に)仮想関数の仕組みを提供させようというもの。これを使うと仮想関数を呼びだすオーバーヘッドがなくなるので良いらしい。基本クラス(Base)をTemplateクラスとして宣言しておいて、派生クラスで自身を指定するのがミ…
要するにVBAでいうVariant型的な物をC++でどう作るのかというお話。この問題に対する設計の定石としては以下のようなクラスを設計することで対応する。 今回は”代入できる”という機能だけ作成。ここにtemplateで指定した型が持つべき関数を規定・制限したり…
コンパイル時に処理を切り替えたい場合に使用。Strategyパターンでは継承により処理を切り替えるが、こちらはテンプレートパラメーターで処理を切り替える。以下のサンプルコードは上述のLINK先のStrategyパターンのをもじって書いた。複数の特徴(戦略)を…
タイトル通り、templateを再帰的に使用することで関数チックな動作をさせる。0の場合を特殊化することで計算をうまく終了させている。また2つのtemplate引数がある場合の特殊化の書き方も覚えておきたい。 #include<iostream> using namespace std; //べき乗を計算 t</iostream>…
テンプレート引数で基本クラスを指定する手法らしい。発想としてはデコレーターパターンに近いような気がする。ここでは文字列の出力を太字・イタリック・あるいはその合成に指定できるようなサンプルコードを書く。 #include <string> #include<iostream> using namespace std</iostream></string>…
C++のテンプレートに関する本を斜め読みしているので、面白そうな奴だけでもまとめておこうと。 配列の要素数を返す関数 配列の最終要素を返す関数 を作成する。template引数に整数値を使用できるというところがポイント。 #include<iostream> using namespace std; //</iostream>…