C++

最近の自分のC++スタイル

何だかんだでC++を書き続けています。今やC++20です。C++0xで騒いでいた頃が懐かしいです。 今回は最近自分がC++を書く時に気にしていることについて簡単に紹介していこうと思います。 基本方針 同じコードを触る開発者が多いため、実装者にとっての利便性よ…

C++のSTLアルゴリズムには関数ポインタよりも関数オブジェクトを渡そうという話

C++

C++のalgorithmヘッダーで宣言されているSTLのアルゴリズム関数テンプレートには,引数に関数ポインタや関数オブジェクト(ファンクタ)を取るものが多い.例えば,引数が一つの関数を受け取るstd::transformは以下のコードと等価である. template <class InputIterator, class OutputIterator, class UnaryOperator> OutputIte</class>…

cout << trueで"true",cout << falseで"false"を出力する

C++

std::boolalphaを使う. #include <iostream> using namespace std; int main () { bool b = true; cout << boolalpha << b << endl; cout << noboolalpha << b << endl; return 0; } 出力は以下の通り. true 1 参考資料 boolalpha - C++ Reference</iostream>

C++0xのautoキーワードによる型推論

C++0xのautoの紹介 autoキーワードを使って変数を定義すると,コンパイラが初期化値を基に変数の型を推論してくれる. int f(); auto x1 = 1; // x1 : int auto x2 = f(); // x2 : int auto x3 = 3.14; // x3 : double auto &x4 = x1; // x4 : int& const au…

typenameキーワードの使いどころ

C++

C++でtypenameキーワードを使うケースは以下の2つがある. テンプレートパラメータを宣言するとき テンプレート内にあるネストされた依存型名を指定するとき(例外あり) テンプレートパラメータの宣言時 ひとつはテンプレートパラメータを宣言するとき. temp…

C++0x Support in GCC

GCCのC++0xのサポート状況は以下のページで確認できる. http://gcc.gnu.org/projects/cxx0x.htmlいち早くC++0xの新機能を試してみたい,けど興味のある機能が最新のGCCで使えるかどうか分からない,という人はここでチェックしてみよう.初期化リストとかau…

Rcppを触り始めた

R C++

Rcppを使うと従来の方法と比べてよりシームレスにRの拡張を作れるようになる. Rcpp: Seamless R and C++ Integration RをC++で拡張する動機 主に以下の二点が挙げられる. 計算速度を向上させる C++から使えるライブラリをRで利用する 1については以下の記…

Boost.MPLでBrainf*ckのプログラムをコンパイル時に動かしてみた

C++のテンプレートメタプログラミングライブラリ「Boost.MPL」について勉強中.新しいものを勉強する時はとりあえずそれを使ってBrainf*ckのインタプリタを作るのが学習法の定石なので,早速Boost.MPLを使ってBrainf*ckのインタプリタを書いた. ソース コン…

C++テンプレートメタプログラミングでの文字列の扱い方で行き詰まった

C++

C++テンプレートメタプログラミングでいろいろ試していたら行き詰まった.文字列の先頭の要素(や特定の位置の要素)をコンパイル時に取得できるようにしたい.以下のようにテンプレート引数に文字列を入れるような形で書きたいのだが,どうやらこれは無理らし…

配列の要素数を返すテンプレート関数

C++

C++テンプレートテクニックの2-4より. #include <iostream> using namespace std; template <class T, int N> int size(T (&x)[N]) { return N; } int main(int argc, char const* argv[]) { int a[] = {1, 2, 3, 4, 5}; cout << size(a) << endl; return 0; } 出力結果 5これは面白い</class></iostream>…

読んでおきたいC++本

とりあえず読んでおきたいC++本を列挙してみる(既読含む). 既読 Effective C++ 原著第3版 定番.C++を使う上で知っておくべき55個のアドバイスが示されている.Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)作者: スコット・メ…

user defined tagsを用いたBoost.BimapとBoost.Foreachを組み合わせて使う

どの型をtypedefしてどれをBoost.Foreachに渡せばいいのかよく分からなかったのでメモ. #include <iostream> #include <boost/foreach.hpp> #include <boost/bimap/bimap.hpp> #include <boost/bimap/multiset_of.hpp> using namespace std; struct name {}; struct place {}; int main(int argc, char const* argv[]) { using namespace boost</boost/bimap/multiset_of.hpp></boost/bimap/bimap.hpp></boost/foreach.hpp></iostream>…

C++でコンテナの初期化・要素追加が手軽にできるBoost.Assign

ヘッダー boost/assign.hpp できること コンテナの初期化・要素追加が手軽にできる. 使用例 前準備 #include <boost/assign.hpp> using namespace boost::assign; vector 簡単. // 初期化 vector<int> v = list_of(1)(2)(3); // 末尾への要素の追加(push_back) v += 4, 5, 6; // v</int></boost/assign.hpp>…

C++でforeachみたいなことができるBoost.Foreach

ヘッダー boost/foreach.hpp できること C++で他の言語にあるようなforeachっぽいことができるようになる. 使用例 BOOST_FOREACHを使ってコンテナの各要素にアクセスする場合の例. std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); BOOST_</int>…

オーバーライドとデフォルト引数の罠

C++

C++でclassを継承して仮想関数をオーバーライドする際に,その仮想関数のデフォルト引数を変更してはならない,という話です.この話はExceptional C++の項目21に載っています. 問題 以下のコードの実行結果を予想してみてください. #include <iostream> using names</iostream>…

抑えておきたいと思ってるBoost C++ライブラリ

ここをちょっと眺めてみて最低限把握しておこうと思ったものを列挙.既に把握しているものも含む. 文字列 format lexical_cast regex, xpressive spirit string_algo tokenizer スマートポインタ shared_ptr weak_ptr 入出力 filesystem スレッド thread 数…

priority_queueを使って要素を小さい順に取り出す

C++

C++ STLのsetやmapの場合は要素を小さい順にソートするけど,priority_queueは要素を大きい順に並べる.priority_queueの定義はこんな感じ. template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue; ここで紛らわしいのは,Compareにはデフォルトでlessが</typename></class>…

最小全域木問題(クラスカル法とプリム法)

最小全域木問題を解くためのアルゴリズム「クラスカル法」と「プリム法」を使ってみた. 最小全域木について クラスカル法 プリム法 PKUの問題 クラスカル法による解答 プリム法による解答 メモリ使用量と実行時間の比較

Disjoint SetsにおけるUnion Find

またPKUの問題を解いてみた.今回のテーマはUnion Find. Union Find Disjoint Sets(互いに素な集合)におけるUnion Findとは,指定された二つの要素x,yが同じ集合に含まれるかどうかを調べるアルゴリズムのこと.集合と要素を多分木とその葉で表現し,木の…

今日解いた問題(PKU1915, 1917, 1941, 2312)

久し振りにPKU JudgeOnlineの問題をC++で解いてみた.今日解いたのは以下の比較的簡単と思われる4題. Problem 1915 - Knight Moves http://acm.pku.edu.cn/JudgeOnline/problem?id=1915 Problem 1917 - Automatic Poetry http://acm.pku.edu.cn/JudgeOnline…

C++のリファレンスでもポリモーフィズムが実現できる

C++

基底クラスのリファレンスで派生クラスのオブジェクトを指した場合でもちゃんと派生クラスでオーバーライドしたメンバ関数を呼び出せるみたい.へぇーへぇーへぇー. #include <iostream> using namespace std; class Base { public: virtual void message() { cout <<</iostream>…

C++での超単純なポリモーフィズムの例

C++

id:syou6162とSkypeチャットしている時ににやにやしながら書いた. #include <iostream> using namespace std; class Base { public: virtual void message() { cout << "Base" << endl; } }; class Inherit : public Base { public: void message() { cout << "Inheri</iostream>…

C++でちょっと役に立つかもしれないコメントの小技

プログラムの修正・実行を繰り返しているときに、ある2ヶ所のコードのコメントアウトを切り替えたくなる時がたまにあったりする。そんなときに役立つ小技。 ↓のような感じで、コメントアウトの切り替えを行いたいコードを//*と/*/と//*/の3行ではさむ。 #inc…

C++で前置・後置インクリメント/デクリメント演算子をオーバーロードする

オーバーロードのやり方自体は他の演算子と同じだけど、前置と後置でどのように定義を書き分ければいいのか知らなかったので調べてみた。 前置と後置の違い 前置インクリメント/デクリメント 戻り値は*thisへのリファレンスにする ++(++t)のように、戻り値を…

mのn乗をO(log n)で計算する

ただしmは整数、nは非負の整数。 こんな感じでやればO(log n)でm^nが計算できる。 #include <iostream> using namespace std; int pow(int m, int n) { if (n == 0) { return 1; } if (n % 2 == 0) { return pow(m*m, n/2); } return pow(m, n-1) * m; } int main() { </iostream>…