valarray関係の未規定仕様を報告した
cpprefjp更新 数値ライブラリ完了
Clang 3.5からはc++14オプション
これまでC++14の機能は-std=c++1y
オプションで使用できていましたが、Clang 3.5から-std=c++14
オプションが追加されます。(Clang 3.5のリリースブランチにマージされている)
Cinder 0.8.6
Cinder 0.8.6がリリースされた。
C++14の仕様策定が完了しました
C++14のDIS(Draft International Standard)に対する各国の投票が行われ、満場一致で承認されました。各国から(主に日本から)のコメントによる文面の細かな修正が残っていますが、その作業が完了次第、ISO/IEC 14882:2014(E) Programming Language C++、別名C++14の規格が発行されます。
C++14は、2011年に発行されたC++11に対するマイナーバージョンアップです。小さな機能追加、および文面のバグ修正が含まれます。
C++14の更新内容は、以下のエントリにまとめてあります:
次はC++17です。そちらはメジャーバージョンアップになる予定で、その議論はすでに始まっています。
C++Now! 2014のセッション概要翻訳が完了しました
C++Now! 2014のセッション概要翻訳が完了しました。
C++Now!はBoostの開発者やC++標準化委員会のメンバが多く集まる、C++の最も濃いイベントです。そのセッション内容はどれも有用ですが、その資料全てを翻訳する余裕はありません。
それでもその有用な情報に触れるきっかけになればと思い、boostjpサイトでは、C++Now!のセッション概要を翻訳して公開しています。
この翻訳も、BoostCon時代から続いて5年目になります。これだけの量を毎年よく訳してるなーと自分でも思いつつ、今回も完成に向けてご協力していただいたzakさん、eagle_raptorさん、chichimotsuさんに感謝します。
Fisher-Yates Shuffle
てきとうに抜粋して書く。
以下のシャッフルアルゴリズムは間違っていて、
def incorrect_shuffle(items): for i in range(len(items)): randomIndex = random.randint(0, len(items)-1) temp = items[randomIndex] items[randomIndex] = items[i] items[i] = temp return items
これには、以下の3つの問題がある:
- 偏る
- 偏る
- 偏る
実は1つだったけど、これは大きな問題だ。
Fisher-Yates Shuffle (Knuth Shuffleとも呼ばれる)の実装は、以下のようになる:
def fisher_yates_shuffle(items): for i in range(len(items)): randomIndex = random.randint(i, len(items)-1) temp = items[randomIndex] items[randomIndex] = items[i] items[i] = temp return items
違いは、以下の1行。
従来のアルゴリズム:
randomIndex = random.randint(0, len(items)-1)
Fisher-Yatesのアルゴリズム:
randomIndex = random.randint(i, len(items)-1)
乱数範囲の開始が0
がi
になっただけだけど、統計をとると偏りがなくなったことがわかる:
ちなみに、C++標準ライブラリに含まれるstd::shuffle()
の実装を調べたところ、GCC 4.9 (libstdc++)、Clang 3.4 (libc++)、MSVC2013のいずれも、Fisher-Yatesを使っていた。([i, size)
ではなく[0, i)
のバージョン)
参照
- Fisher–Yates shuffle - Wikipedia
- 「フィッシャー・イエーツ」と読む。
変更履歴
- 2014/08/12 15:14 MSVCは従来のアルゴリズムではなくFisher-Yatesを使っていたので、訂正
- 2014/08/12 15:18 libstdc++とlibc++もFisher-Yatesだったので訂正
Boost.勉強会 #16 大阪
9月20日(土)に、大阪でBoost.勉強会を開催します。主催は遥佐保さんです。
ひさしぶりの大阪開催ですので、この機会にぜひご参加ください。
Boost 1.56.0がリリースされました
GitHubへの移行とモジュール化
このバージョンから、Boostの開発リポジトリがSubversionからGitHubに移行しました。それにともない、GitHub上ではBoostの各ライブラリが、モジュールという単位で分割されるようになりました。モジュールは、関連するライブラリを集めたものや、Boostのいろいろなライブラリで使うベースライブラリをまとめたものです。CoreやWinApiなどのモジュールは後者になります。
新ライブラリ
Boost 1.56.0では、アラインメントを扱うAlignライブラリと、C++11のstd::type_index
のBoost版でもあり、それの拡張も入っているType Indexライブラリが追加されました。
非推奨ライブラリ
BoostからC++11標準に入れるたたき台となっていたライブラリ群であるTR1が非推奨になりました。このライブラリは、Boostの機能をstd::tr1
名前空間で定義し直しただけのものなので、Boostの機能を使うか、C++11標準ライブラリを代わりに使ってください。
その他主要な更新
boost::variant
が可変引数テンプレートに対応しました。コンパイルがいくらか速くなることを期待できます。- Containerに、DLmallocベースのアロケータが入りました。
- Containerの
map
とset
の実装に使用するツリー構造が、選択できるようになりました。 - Flyweightが、可変引数テンプレート、ムーブ、
initializer_list
での初期化に対応しました。 - Multi-Indexの
hashed_indices
が、高速化しました。 - Multiprecisionに、2進表現の浮動小数点数型
cpp_bin_float
が追加されました。 - Optionalが、C++標準に提案されている仕様に対応しました。ムーブや
emplace()
のサポート、値にアクセスする新たな方法として、value()
、value_or()
、value_or_eval()
のサポートが追加されました。(nullopt
はまだ) - Smart Pointerの、
make_shared()
とallocate_shared()
に、配列のサポートが追加されました。 - Threadに、C++標準のConcurrency TSで提案されている
future
の拡張であるwhen_any()
とwhen_all()
が追加され、同様に提案されているexecutorが追加されました。
そのほか細かい変更は、リリースノートを参照してください。この記事の先頭に、日本語訳したリリースノートへのリンクを貼ってあります。