サービス終了のお知らせ いつもYahoo! JAPANのサービスをご利用いただき誠にありがとうございます。 お客様がアクセスされたサービスは本日までにサービスを終了いたしました。 今後ともYahoo! JAPANのサービスをご愛顧くださいますよう、よろしくお願いいたします。
kazuhoさんがやってくれました。 ずいぶん前からjsonをC++でパース(SAXじゃなくてDOM)するのに小さいライブラリないかなーと思ってました。個人的にはjson-cというのを使ってたのですが、幾らか気に入らない所があったりビルドが少し手間だったりしていました。STLしか使わなくてvectorとかmapで表現されるツリー構造な物が欲しいなぁって思ってたんです。 とあるIRCで昨日、kazuhoさんと「ほしいですよねー」という話から始まって、githubにあるjsonxxとかも物色しながら「いいのないねー」とか言ってたらkazuhoさんが「もすこし綺麗に書けそう」って言い出して朝から本格的に書き始めてついさっき出来上がりました。速いw 名前はpicojson とても小さく、実装コードだと300数十ステップ程です。しかもヘッダファイルだけなので管理が楽です。 試しにwassrのpubl
picojsonを見ていて最近のC++のライブラリはこんなにカッコいいのかと思って、僕もヘッダオンリーのC++コードを何か書きたくなったのですが、ちょうどC++で木構造を扱えるライブラリがなかなか見つからなかったので軽い感じのクラスを書きました。コードはgithubにあります。名前はpicojsonに影響を受けまくってmicrotreeにしました。 使い方は以下のようなノリになります。STLにあわせてテンプレートな感じにしようかとも思ったのですが、Pythonのnetworkxというグラフを扱うライブラリが使いやすいので、それに似せる感じで各ノードがキーとプロパティマップを持つようにしました。 #include "microtree.h" using namespace std; using namespace microtree; int main(int argc, char** ar
C++が他のオブジェクト指向言語と比べて難しいのは、やはりメモリ管理をプログラマが自分でしなければいけない点だと思います。よくよく注意しないと、削除し忘れたり、同じオブジェクトを2度削除してしまうというエラーが発生します。このノートでは、オブジェクトを「値オブジェクト」と「参照オブジェクト」というカテゴリに分け、詳細設計の段階で注意すべき点を整理しておきたいと思います。 0. はじめに 私自身今までいくつかのプログラミング言語を使ってきましたが、C++ が他のオブジェクト指向言語と比べて難しいのは、やはりメモリ管理をプログラマが自分でしなければいけない点だと思います。例えば、 Person* person = new Person(); と生成したオブジェクトは、使い終わったら次のように削除しなければなりません。 delete person; 生成してすぐ削除するなら簡単なのですが、実際に
SonicGarden Study #11で放送された資料から一部スライドを抜いたものになります。 http://sonicgarden.doorkeeper.jp/events/13229 ----- 優れたプログラマだけが優れたソースコードを書くことができます。 では優れたプログラマになるにはどうすれば良いでしょうか。 自分の書いたコードを、優れたプログラマに指摘してもらうことが一番の近道です。それがコードレビューです。たった一人でコードレビューも受けずに、ただ書き続けてもクソコードはクソコードのままなのです。 そこで今回は、良いコードが書けるプログラマになるための、コードレビューを上手に実践する秘訣を話します。
Boost.勉強会 #8 大阪 に参加してきました。発表者、運営者の皆様お疲れ様でした。今回もいろいろと黒魔術的な発表があり「これが変態かー」と感慨深く見ていたのですが、それはそれとして、個人的に気になっていたテーマとして「C++ でのテスト」に関連する発表が 2 件ほどあったので、楽しみにしていました。 C++でテスト駆動開発 - @akineko Boost.Testの紹介 - @hotwatermorning C++ のテストフレームワークも数多く公開されており、好みや用途によって選択肢が変わって来るのですが、まぁ今だと選択肢として挙がるのは「Boost.Test か googletest か」になってくるのかなと思います。どちら(もしくは、上記以外を含めたどれか)を選択すべきか、と言う問いに対しては、残念ながら現状でも決め手となるものに欠けているのですが、自分が利用する上で選択する
もし、C99が使える環境であれば、round()という関数が用意されている。これは、小数点以下を四捨五入した整数値(ただし型はdouble)を返す。 次にC99が使えない環境の場合であるが、まず数値が常に正の値であるならば、小数点以下を四捨五入を行うには、0.5を足して、小数点以下を切り捨てればよい。 具体的には、 a=123.456; a+=0.5; a=int(a); の様に書くと、aは123になる。 小数第何位で四捨五入をしたいという場合は、その位分を最初に掛けて、整数での四捨五入後、同じ数字で割ってやればよい。 具体的には、 a=123.456; a*=100; a+=0.5; a=int(a); a/=100; としてやると、aは123.46になる。 逆に大きい位で四捨五入をする場合は、最初に位分で割って、整数での四捨五入後、同じ数字を掛けてやればよい。 具体的には a=123.
std::vectorの連結で演算子が使えない、という話題に対して。 どういう話かというと、こういうことです。 #include <iostream> #include <vector> #include <algorithm> #include <iterator> int main(int, char* []) { std::vector<int> v1; std::vector<int> v2; v1.push_back(10); v1.push_back(20); v1.push_back(30); v2.push_back(100); v2.push_back(200); v2.push_back(300); // v1 += v2; // これをやりたいけど、こうは書けない v1.insert(v1.end(), v2.begin(), v2.end()); // これが一般的
このマクロの目的 va_argマクロは、可変長引数を取得する。 定義 #include <stdarg.h> type va_arg(va_list ap, type); 働き このマクロは、二番目の引数と同じ型の返り値を持つ表現(expression)に展開される。 va_list 型の ap は va_start() で初期化されたものである。 va_arg の実行によって、 ap は順番に引数を返すように変更される。 引数の型 type は、実際の引数の型へのポインタ型であり、特定された型は type の前に*を添えることで取得できるように決定される。 ありもしない引数を取得しようとしたり、引数の型が違っていた場合の振る舞いは未定義である。 va_start() 後の最初の実行では、 va_start() で指定した parmN の直後の引数の値を返す。 続けて実行すれば、残りの引数
某掲示板で話題に上って初めて知った。 今までダメだと思っていたけど、配列をnewする時、空の初期化子"()"を付けて初期化できるみたい。 つまりこんな感じに書けるということ。 JIS X 3014:2003を読み直してみると、確かに配列に初期化子を付けてはいけないとはどこにも書いていない。 ただ、引数のある初期化子の場合、引数をnewする型に変換できたり、コンストラクタが定義されたりしていなければならいため、結果的に配列に引数付きの初期化子が使えない、というだけ。 そして引数なしの初期化子は値初期化される、とある。そして値初期化は配列に対してもその挙動が定義されているため初期化できる、という寸法。 今までずっと
new で配列確保と同時に初期化ってできなかったっけ ? と思って調べてみたら default constructor をもっている class type や arithmetic, enumeration, pointer, pointer-to-member type なら以下のように書くことができるらしい。 class bullet {}; int main(void) { const unsigned int MAGAZINE_MAX = 100; const unsigned int BUF_SIZE = 0xffff; // initialize 100 bullets with the default constructor bullet() bullet* bullets = new bullet[MAGAZINE_MAX](); // initialize a buffe
constメンバ関数は重要 - Faith and Brave - C++で遊ぼう より. const と言うキーワードは C++ の中でも重要な位置を占めています.そのせいもあってか,「コメントで IN とか OUT とか書く位なら const 使えバカ」「Effective C++ に載ってるんだから const 使え」と言ったような手厳しい意見も聞かれます.一方で,その使用範囲の広さからか「const って良く分らないし・・・」「要は,(プログラマが)気を付けてれば良いんでしょ?」「こまけぇこたぁいいんだよ!!」と言った声も聞かれます. 今回は,そんな const について少し記述してみます. おさらい #include <iostream> #include <string> /* --------------------------------------------------
これよりも Hoge::Hoge(const string& initName) { this->name = initName; }これを使いましょうという話。 Hoge::Hoge(const string& initName) : name(initName) { } 理由は、初期化リストではstringのコピーコンストラクタのみが実行されるのに対して、コンストラクタでの代入では、コンストラクタ・代入が行われて効率が良くないから。 またメンバの name がもし仮に const であるならば(これは良くあることだが)、そもそも初期化リストでしか初期化できない。 代入を使うほうが理にかなっているというシチュエーションもあり、(大量組み込み型データメンバーの場合)、その詳細は、Effective C++ 【改訂第2版】 アスキーアジソンウェスレイシリーズ―Ascii Addison We
Armadillo C++ library for linear algebra & scientific computing Armadillo is a high quality linear algebra library (matrix maths) for the C++ language, aiming towards a good balance between speed and ease of use Provides high-level syntax and functionality deliberately similar to Matlab Useful for algorithm development directly in C++, or quick conversion of research code into production environme
vectorは、デストラクタが呼び出されると、メモリの解放が行われます。インスタンスのスコープを抜ける時、解体の直前で自動的に呼び出されます。最終的には解放されますが、その間で、要素を変えた場合は、下記の通りです。 vectorは内部に一括確保した領域を保持していて、この領域が足りなくなる時、新しくより大きな領域を確保して、既存の要素をコピーします。その後、古い領域は解放されてなくなります。 しかし、要素を削除した場合は、内部の領域が縮小する事はありません。領域が縮小されないということは、一度確保してしまった領域は、不要になってもメモリを返却してくれないという事です。 その場合、swap技法を使えば、強制的に領域を切り詰めることは可能です。 std::vector<int>(array).swap(array); 一時オブジェクトを作り、既存のvectorをコンストラクタの引数に渡します。
2009年の抱負は、ダイエットと質素倹約である。 ダイエットは早くも挫折しそうだが、質素倹約はいい感じである。 今のペースだと給与の3/4は貯蓄できそうだ。 抱負の追加として、この日記を一日一回更新にしようと思う。 以前は携帯電話のプログラムだったので、それなりにいろいろ書けたが 今はPSPをやっているので、まったく日記を書くことができない。 でも、日記は書きたいので、プログラムに関する些細なことを毎日書いていこう。 vecotrで確保したメモリは、clearメソッドを呼んでも解放されず デストラクタが来るまではずっとメモリを確保している。 そこで、以下の方法で解放することができる。 std::vector<int> hoge; // hogeのresizeとclearを繰り返す。 // 解放 std::vector<int>().swap(hoge); 一時オブジェクトを作成し、そのオブ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く