Boost 1.57.0のリリースノート翻訳を開始します

C++

Boost 1.57.0のBetaがリリースされ、本リリースが近づいてきているので、恒例のリリースノート翻訳を開始します。

現在、boostjpサイトは作業環境をGitHubに移行中のため、まだサイトの方に反映はできないのですが、ひとまずboostjp/siteリポジトリにMarkdownでリリースノートを書き、GitHub上のプレビューで読めるようにしようと思います。

リポジトリは以下です:

Boost 1.57.0のリリースノートは以下です:

push権限を持っていない方は、pull requestをいただければ、そのあとに権限をお渡しします。GitHub上でこのファイルを直接編集するとpull requestを作成できるので、GitとGitHubに慣れていない方でも、気軽に編集していただければと思います。

1文字の誤字修正から、気軽にご参加ください。

valarray関係の未規定仕様を報告した

C++

C++11で追加された以下のクラスのコピーコンストラクタの仕様がなかったので、報告しました。

  • slice_array
  • gslice_array
  • mask_array
  • indirect_array

提案仕様の文言は、libstdc++のドキュメントにあったのをそのまま送ったら、Daniel Krüglerさんが「この文言はちょっと曖昧だから」と直してくれました。

現状の実装仕様としては、「コピー元のxxx_arrayクラスオブジェクトが参照するvalarrayオブジェクトを、コピー先も参照する」です。

cpprefjp 次のマイルストーンは正規表現ライブラリ

C++

cpprefjpサイトの次のマイルストーンは、正規表現ライブラリを作成します。

そのマイルストーンを達成するためのタスクリストを、GitHub Issuesとして作ってあります。

cpprefjp/siteリポジトリのメンバになっていてご協力いただける方は、タスクの担当をご自分に設定してください。現在メンバになっていない方で、新たにご協力いただければ、担当したいタスクのところにコメントをいただければと思います。

cpprefjp更新 数値ライブラリ完了

C++

<complex>ヘッダと<valarray>ヘッダのリファレンス作成が完了しました。<complex>は、C++14の仕様にも対応してあります。

これによって、数値ライブラリ全体のリファレンス作成が完了しました。

標準ライブラリ全体としては、全52ヘッダ中、42ヘッダのリファレンス作成が完了しています。残りは、正規表現ライブラリ、ローカライズライブラリ、入出力ライブラリです。

次に何をやるかは、現在GitHubのIssueで意見を募集しています。

私はこのあと少しの間は、boostjpサイトの作業環境をGitHubに移行する準備を行います。

Clang 3.5からはc++14オプション

これまでC++14の機能は-std=c++1yオプションで使用できていましたが、Clang 3.5から-std=c++14オプションが追加されます。(Clang 3.5のリリースブランチにマージされている)

C++14の仕様策定が完了しました

C++

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++

C++Now! 2014のセッション概要翻訳が完了しました。

C++Now!はBoostの開発者やC++標準化委員会のメンバが多く集まる、C++の最も濃いイベントです。そのセッション内容はどれも有用ですが、その資料全てを翻訳する余裕はありません。

それでもその有用な情報に触れるきっかけになればと思い、boostjpサイトでは、C++Now!のセッション概要を翻訳して公開しています。

この翻訳も、BoostCon時代から続いて5年目になります。これだけの量を毎年よく訳してるなーと自分でも思いつつ、今回も完成に向けてご協力していただいたzakさん、eagle_raptorさん、chichimotsuさんに感謝します。

Fisher-Yates Shuffle

C++

てきとうに抜粋して書く。

以下のシャッフルアルゴリズムは間違っていて、

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. 偏る
  2. 偏る
  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)

乱数範囲の開始が0iになっただけだけど、統計をとると偏りがなくなったことがわかる:

ちなみに、C++標準ライブラリに含まれるstd::shuffle()の実装を調べたところ、GCC 4.9 (libstdc++)、Clang 3.4 (libc++)、MSVC2013のいずれも、Fisher-Yatesを使っていた。([i, size)ではなく[0, i)のバージョン)

参照

変更履歴

  • 2014/08/12 15:14 MSVCは従来のアルゴリズムではなくFisher-Yatesを使っていたので、訂正
  • 2014/08/12 15:18 libstdc++とlibc++もFisher-Yatesだったので訂正

Boost.勉強会 #16 大阪

C++

9月20日(土)に、大阪でBoost.勉強会を開催します。主催は遥佐保さんです。

ひさしぶりの大阪開催ですので、この機会にぜひご参加ください。