きままにブログ

プログラミングを主とした私のメモ帳です。寂しいのでコメントください笑

C++初心者向け講座その1 ~RAIIのお話~

C++

概要 C++の初心者向けに、クラスを利用したリソース管理及び特殊なメンバ関数であるコンストラクタ、デストラクタ、コピーコンストラクタ、ムーブコンストラクタと、デフォルトで定義されうるコピー代入演算子、ムーブ代入演算子について簡単な解説をしなが…

メモリプールの修正

C++

インナークラスを使って定義すると、その内部のクラスを呼び出すときに、あるクラスがそのクラスのポインタを保持しようとすると実体化できないとエラーになるので修正しました。 namespace mytools { template <typename T, size_t SIZE> class Pool { protected: template <typename T> class St</typename></typename>…

C++における契約プログラミング♪

C++

契約プログラミング ある程度の規模のプログラムを書くと、関数が増えてきます。ある関数に何らかのデータを渡し、処理して結果を返したり、あるいはクラスの状態が変わったりします。ところで、プログラム中の実行時エラーには2種類あります。 プログラマの…

C++14でcurry化

C++

関数型言語では関数が第一級の値という。私もよく分かっていないが、とりあえず何をするにも関数で、関数を操作するのだそうだ。その一つの例としてカリー化があげられ、ある関数に対して引数を一部与えて束縛し、その関数を返すというものである。C++で実装…

メモリプール

C++

概要 固定長メモリプールを再び作った。 簡易unique_ptr, shared_ptrを自作し、速度の向上を図った。 普通にunique_ptr, shared_ptrを使用するよりも2~3倍の実行速度が得られた。 実装について 簡易shared_ptrであるSharedPtrを使用することを前提としたメ…

コールバックのインターフェース(テンプレート使用)

C++

あるクラスのメンバ関数をコールバックとするにはいろいろな実装があると思いますが、例えばテンプレートを使うと次のようになります。ただし、あんまり美しくないですね……。std::functionalとstd::bindを使えばすぐに終わりますがちょっと速度が出ない問題…

ネタの蛇足的解説

C++

本記事はhttps://twitter.com/staryoshi/status/669763731610431488のたくさんの反響を記念して蛇足的な解説を並べたものです。あまりC++に興味を持っていなかった人もこれを見て興味を持っていただけたら幸いです。もちろん、実際にはこれらの表記で困るこ…

【C++ちゃんは】クイックソートの非再帰版【かわいい】

C++

クイックソートの非再帰版 クイックソートは通常、再帰を使って書かれます。再帰呼び出しはスタック領域を使ってしまいますので、呼び出しがあまりにも深くなるとスタックオーバーフローを出してしまいます。そのため、再帰呼び出しを使わないで書いてみまし…

CSSサンプル記事

目的 CSSのレンダリングを確認するための記事です。 見出し 小見出し 小小見出し リスト 順不同リスト リスト1 リスト2 リスト2.1 リスト2.2 リスト2.2.1 リスト2.2.2 リスト3 順序リスト リスト1 リスト2 リスト2.1 リスト2.2 リスト2.2.1 リスト2.2.2 リス…

rangeクラスを作り、アダプタを適用していく例

C++

前回の記事の続きですが、作ったアダプタを例えば範囲クラスrangeに適用してみたいと思います。今回は簡単のためイテレータを実装せず、getメンバ関数でrangeを0から順番に回していきます。しかも範囲チェックはしていません。 Step1 まずはアダプタがない状…

関数の合成を保存し、実行する

C++

関数をどんどん適用できるAdaptorを考えます。 背景 ある関数fがあって、それに対してさらに関数gを適用した関数h = g(f)を考えます。これをC++で表現するというのがこの記事の目的です。ところでどうしてそんなことが必要なのかというと、LINQ for C++を自…

scope_exitをmoveできるようにしたmovable_scope_exitを実装

C++

scope_exitでは、その変数を定義したスコープを抜けたときの処理を記述できるように実装しましたが、抜けた時に処理をしないようにする、あるいは処理を延期できるようにすることを目標にmovable_scope_exitを実装しました。ポイントはAnyクラスの実装とほぼ…

SQLite3のテストだよ!

SQLite3 数あるSQLアプリケーションの中でもダントツで早く! 簡単に! 使えるものです。まずはじめにC++(というかC言語)で利用するために適当なデーターベースを作っておきます。test.dbとしてファイルを保存しました。なんでもいいです。続いてテーブルを作…

scope_exitの実装

C++

スコープを抜けたら何らかの処理を実行する物を作りました。 使用例 C* p = new C(1, 2); auto s = mytools::make_scope_exit([&p]() { delete p; }); 実装 template <typename Func> class scope_exit { public: scope_exit(Func func) : func(func) {} ~scope_exit() { fu</typename>…

Any型の実装

C++

Anyを実装しよう Any型とは 何でも格納できる型を作ることを考えます。普通はそんな型は必要ないし、当然その分オーバーヘッドが生じてしまうので利用する箇所は限られるだろうけどコンテナに格納するなどして便利なことはあるにはあります。 実装方法 Step1…

Optional

C++

以前作ったOptionalにちょっと機能を付け足しました : operator()(Arg...)にて再配置newによって再構築可能としました。これにより不要なコピーのオーバーヘッドがなくなります。 コンストラクタとデストラクタが同数呼び出されるように修正しました。コンス…

古い日記に言及, メソッドチェーン

C++

PHP の new 演算子とメソッドチェイン:Rainy Day Codings:So-net blog C++ ですらできる(でもメモリリークします)。 #include <iostream> class Foo { public: void method() { std::cout << "hello!\n"; } }; int main(int, char*[]) { new Foo()->method(); retu</iostream>…

簡易メモリアロケータのunique_ptrを返す実装

C++

#pragma once #include <vector> #include <memory> namespace mytools { template <typename T> class FixedVector { template <typename T> struct Storage { Storage(size_t size) : buffer(new T[size]), next(nullptr) {} ~Storage() { delete[] buffer; delete next; } T* buffer; Storage<T>* nex</t></typename></typename></memory></vector>…

C++AMP

C++

お久し振りです。しばらくプログラムを書いていなかったのですが、VisualStudio 2015 RCも出たことでC++を書いています。今回はC++AMPを触ってみました。特定の行列のなかの部分行列にアクセスし、GPUで演算を行うものをC++AMPを使って書いたものです。処理…

ダイクストラ法

なんか大変微妙な実装になってしまったが、有向・無向グラフを実装した。正直、使うごとに自分で定義してアルゴリズムも書き直したほうがいい気がするのでこれ以上は改良しないで色々グラフを堪能していこうと思います。 使用例 #include <cstdio> #include "Graph.h</cstdio>…

C++17予定らしいawait

C#では便利なawaitがありますが、C++にも導入予定らしいです。これでマルチスレッド周りがより便利になりますね。VC++ 2013Nov CTPより、VisualStudioでもインテリセンスはキキませんがコンパイルができるので色々遊べます。ジェネリックラムダとかconstexpr…

リファレンスクラス

C++

定数を返すには巨大過ぎるデータを扱う場合できれば参照やポインタで返したいです。ところが、ポインタを直接渡すと、そのポインタが変更されるような場合困ります。そもそも参照やポインタで返すべきではないのですが、場合によっては参照で受け取りたいよ…

コンテナ要素に並列アクセスで初期化したいとき

C++

std::transformのbinary operationの使い方: array<int, 3> a1 = { 1, 2, 3 }; array<int, 3> a2 = { 4, 5, 6 }; array<int, 3> a3; std::transform(a1.begin(), a1.end(), a2.begin(), a3.begin(), [](const int a, const int b) { return a * b; }); for(const auto it : a3) { pri</int,></int,></int,>…

vectorとarrayをつかう

C++

どちらも当然引数に渡すとコピーされる。(一応確認) void func(vector<int> v) { v[0] = 3; } void func(array<int, 3> v) { v[0] = 3; } int main() { vector<int> v1 = { 1, 2, 3 }; array<int, 3> v2 = { 1, 2, 3 }; func(v1); func(v2); printf("%d, %d", v1[0], v2[0]); } 当たり</int,></int></int,></int>…

ドラッグ&ドロップ

[C++]ドラッグ&ドロップの再現 • C言語交流フォーラム ~ mixC++ ~ にて謎が解決しました。ありがとうございます。〔私は質問者ではないのですが〕以下のようにマウスの移動および移動中のフラグをMOUSEEVENTF_LEFTDOWNとすることでドラッグ&ドロップが再…

メンバ変数のm

メンバ変数の m_ | L.Entisの日記 | スラッシュドット・ジャパン この日記ではメンバ変数にm_をつけて、ローカル変数と区別する意味、コード中の意味の違いについて述べられています。私はメンバ変数にm_など付けるのは冗長だと考えています。変数を使うとき…

Windowを表示するだけのクラス

スクリーンショットは都合上、300x200の大きさにしています。 ウィンドウを複数作れるように、基本となるクラスを作ってみた。まあ、ウィンドウをたくさん作ることもあまりないし、細かいことをしようと思うとどうせプロシージャをいじる必要が出てくるので…

S_JISの1文字ごと全文字読み取り

C++

イテレータで全文字読み取ることを考えます。文字列返却のために、イテレータクラスのメモリを使っていますが、相当邪道だと思います。unique_ptrは使いたくないし、素直にポインタとサイズを返すのがいいのかもしれないが、簡単に使えないし困ったものです…

tupleを使った変数の交換

C++

まあ、使い道はないです。参照を使うというのもなくはないかな~ int main() { using std::tuple; int x = 1, y = 2; tuple<int&, int&> t(x, y); t = std::make_tuple(y, x); printf("%d, %d", x, y); // 2, 1 getchar(); return 0; }</int&,>

使い捨てラムダ

C++

ラムダはどんどん使い捨てていくのがいいと思うお。 int x = 0, y = 0, z = 0; const int n = 10; [&]() -> int& { if(n % 2 == 0) { return x; } else if(n % 3 == 0) { return y; } else if(n % 5 == 0) { return z; } }() = n; printf("%d, %d, %d\n", x,…

gotoかわいいよgoto その2

C++

enum class E { A, B, C }; switch(E::A) { case E::A: printf("処理A\n"); goto L; case E::B: printf("処理B\n"); break; case E::C: printf("処理C\n"); goto L; L: printf("A, C共通処理\n"); } printf("全共通処理"); これはなかなかいいと思うw

3項演算子とラムダ式

C++

こういうときってよくあります。 C c; const int x = 10; if(x > 10) { const C c1; c = c1; // コピーが発生 } else { const C c2; c = c2; // コピーが発生 } // cを使う でもこれだとconstを付けられません。このときよくある3項演算子の他に、ラムダ式で…

Project Euler Problem 3

13195 の素因数は 5, 7, 13, 29 である.600851475143 の素因数のうち最大のものを求めよ. 先ほど実装したOptionalと、LINQ for C++を用いて、簡単に求めてみました。素因数クラスは、インクリメントするたびに次の素数をOptional付きで返します。このため、…

Optionalを実装せよ

C++

Optionalは無効値を持った型です。Optionalを作るときに、メモリ確保は行わず、スタック上の変数に対してplacement newによって再配置を行います。そのためオーバーヘッドは少ないはずです。 テストケース 正の数の場合は値を返し、そうでない場合は無効値を…

LINQ for C++ライブラリを使ってみた

C++

ヘッダファイル1つインクルードするだけで使えるこのライブラリは、簡単に使えてちょっとした配列の操作にもいいかもしれないですね。 #include <stdio.h> #include <LINQ/cpplinq.hpp> int main() { using namespace cpplinq; struct student { char* name; int point; } list[] = { { </linq/cpplinq.hpp></stdio.h>…

《【質問】C++でソフト開発したい!【初心者】 >>317》の問題

1)縦横のそれぞれの列に1~6の数字が1つずつ入ります(ここは数独と同じ) 2)マス目にあらかじめ入っている(数字)は太線で囲まれたブロックに入る数字の合計を表しています 3)太線で囲まれたブロックの中には同じ数字が入ることもあります┏━━┳━━┳━━┳━━┯━━┳━━┓ …

Project Euler Problem 2

フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである. 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...数列の項の値が400万以下の, 偶数値の項の総和を求めよ. Project Euler Problem 1の追記で示したように、R…

Project Euler Problem 1

10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ. auto list = std::vector<int>(999); std::iota(list.begin(), lis</int>…

ネタ

自称C++使いですが、 http://d.hatena.ne.jp/Gemma/20080129 の要望に答えましょう。〔以下プログラム部分以外は殆ど引用です〕C++使いの人に、 関数型言語って何がすごいんですか と聞かれて、 じゃあC++で accumulator すなわち、数nをとり、「数iを取って…

Luaでnewuserdataして、それを利用しようとすると元のデータが破損している【解決】

エラーする状況 デバッグモードでたまにRTTI情報を持っていないと怒られる。 #include <iostream> #include <Lua53/lua.hpp> using std::cout; using std::endl; struct Object { virtual ~Object() { cout << "Object::~Object();" << endl; } }; struct C : public Object { int x; </lua53/lua.hpp></iostream>…

C++のキャスト

C++

なぜキャストが必要か? コンパイラは、あるメモリの最初のアドレスを知ったところで、それがどこまで続くのか、或いはどのメンバがどの位置に現れるかということを事前に知っていないといけません。そうしないと計算できませんからね。だから、ある変数xが型…

簡易メモリアロケータ―ちゃん

C++

概要 いわゆるリスト構造を1つ1つ繋ぐのではなく、複数個をまとめて繋いでいく形のリンクリストを際発明しただけのものです。freeもできて、そのポインタを後で再利用していきます。例外周りが適当です。有用な点は、どれだけメモリ確保しても元のデータのポ…

Luaの関数をC側で記録し、いつでも呼び出せるようにする

概要 例えば、関数myfuncをLuaで定義し、それを登録する関数registerMyFunctionおよび実行する関数doMyFunctionをC側で用意するとする。すなわち、テストコードは次の通り : local myfunc = function() print("test_code"); end registerMyFunction(myfunc);…

placement newを使ってLuaで確保したメモリに上書き

ユーザーデータを使うとき、Lua側でメモリ管理をしてもらうためにlua_newuserdataを使う。その戻り値は確保した先頭のポインタであるため、これをnewの引数にとってPlacement newを行う。 int FDTDLua::L_createMaterial(lua_State* L) { auto self = (FDTDL…

クロージャーを纏めて登録

C++の関数をLuaから呼び出す C++をLuaから呼び出す際、C++側のクラスのなかのメソッドを呼び出したい場合、そのクラスのポインタが必要となる。グローバル変数に代入するのは気持ちが悪いので、Luaのクロージャーにポインタを記憶させ、関数が呼ばれるたびに…

LuaとC++の連携

Luaのプログラム例 まずはLuaで次のようなことをしてみたいと思う。 moc = MOC.new(); moc2 = MOC.new(); function func(x) setNumber(x); moc:set(x); moc2:set(x * 2); return x * x; end function call() x = getNumber(); print("x is " .. x .. "\n"); …

テンプレートで関数のインターフェイスを規定

C++

規定の抽象クラスBがあって、これを継承してクラスCがある。このとき、基底クラスBのメソッドfuncをクラスCで公開したいが、部分的な処理だけを派生クラスで定義し、funcの外枠はBで定義したい例。 #include <iostream> using namespace std; template <typename T, typename ...Args> class B { publ</typename></iostream>…

設計が悪い、やり直し

C++

事案 遺伝的プログラミングを実装したい 条件をクラスで定義し、それに基づいて構文木を出力する ノードは条件、行動の2つからできているが、後々拡張する可能性がある 想定する実装 template <typename T> class GPCase { // ランダム生成 // 交叉 crossover // 逆位 in</typename>…

ランダムな木

C++

再帰的にその都度乱数を生成してランダムな木を作るテスト。遺伝的プログラミングの最初の個体生成に使うために実験したものです。もっと良いアルゴリズムがあるはずですがとりあえずこれで行きましょう。 namespace { void rec(int size, int c = 0) { std:…

gotoかわいいよgoto

C++

C/C++ではgotoが使える。とても自由なこの制御構文は、2重のforループを抜けるとき大変役立つ。 #include <iostream> using namespace std; void func() { cout << "In func()" << endl; goto exit; cout << "skip" << endl; exit: cout << "End of func()" << endl; }</iostream>…