読者です 読者をやめる 読者になる 読者になる

cpprefjp - cstdlibヘッダの作業完了

C++

<cstdlib>ヘッダのリファレンスとして、プロセス終了関係を書きました。

今のところ、このヘッダの、ほかの機能のリファレンスを書く予定はありません。

Emscripten関係の記事

C++

私のGistに、以下の記事を追加しました。

こちらに記載してもよかったのですが、バージョンが変わったときなどで記事の更新管理がしやすいように、Gistに置くことにしました。

Boost 1.59.0がリリースされました

C++

Boost 1.59.0がリリースされました。リリースノートはいつものように、boostjpサイトで翻訳を行い、公開しています。

新ライブラリ

Boostには以前からlexical_cast()という強力な数値・文字列間の変換関数がありました。このライブラリは、それをより強力にした機能が多数入っています。

たとえば、型変換の際に使用するマニピュレータを指定できるようになったので、基数(2進数、16進数とか)の指定、浮動小数点数の精度の指定などができます。ほかにも、変換に失敗したときのエラー処理も、選択の幅が広がったりしています。

C++14で書かれたコルーチンライブラリです。前バージョンは非推奨となります。

主な更新内容

少し前にこのブログで紹介した、ranked indicesという新しいインデックスが追加されました。参照:「Boost.Multi-index ランク付きインデックス

Boost.Testがバージョン3にメジャーアップデートしました。

これまでは、BOOST_CHECK_EQUAL(a, b)のように、比較演算子ごとにマクロを使い分けていましたが、このバージョンから汎用的なテストマクロとしてBOOST_TESTが追加されました。

BOOST_TEST(a == b)のように、演算子で直接比較ができ、失敗した時のエラーメッセージもこれまで通り、比較対象の「値」(変数名ではない)が出力されます。Power Assertと呼ばれているものですね。

#define BOOST_TEST_MODULE example
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(a_equal_b_test)
{
  int a = 1;
  int b = 2;
  BOOST_TEST(a == b);
}
Running 1 test case...
main.cpp:8: error: in "a_equal_b_test": check a == b has failed [1 != 2]

*** 1 failure is detected in the test module "example"

そのほか、パラメタライズドテストのサポートも追加されています。Boost.Testでは、Data driven test(データ駆動テスト)と呼ばれています。

pandocの拡張機能で、Markdownを強制的に改行させる

pandoc

pandocでMarkdownからHTMLに変換する際、オプションとして-f markdown+hard_line_breakを付けると、一度の改行で<br/>が入る。

pandoc -o a.html a.md -f markdown+hard_line_breaks
  • -fは、入力フォーマットを指定するオプション
  • markdown+hard_line_breaksは、Markdownフォーマットに、強制改行の拡張機能を付加する、という意味。
    • +のほかに、-を付けて特定の機能を無効にすることもできる。

通常、以下のようなMarkdownテキストは

こんにちは。
さようなら。

以下のようなHTMLに変換されるが(ここではHTMLの一部のみ記載)、

<p>こんにちは。 さようなら。</p>

上記オプションを設定することで、以下のような改行入りのHTMLに変換される。

<p>こんにちは。<br />さようなら。</p>

ただし、そのMarkdownテキストをGitHubに置く場合、GitHub上でのプレビューでは改行が入らないので注意。

Boost.Multi-index ランク付きインデックス

C++

Boost 1.59.0から、Boost.Multi-indexに、ranked indiciesというのが入ります。

これは、キーが何番目に大きいかを対数時間で取得できる、連想配列のインデックスです。

イメージとしては、mapに対してit = m.find(key)をして得たイテレータに、distance(m.begin(), it)としてイテレータの位置を求めるのが、容易になるという感じです。

#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ranked_index.hpp>
#include <boost/multi_index/member.hpp>

struct Person {
    int age = 0;
    std::string name;

    Person() {}
    Person(int age, const std::string& name)
        : age(age), name(name) {}
};

using namespace boost::multi_index;
using Container = boost::multi_index_container<
    Person,
    indexed_by<
        ranked_non_unique<member<Person, int, &Person::age>>
    >
>;

int main()
{
    Container c;

    c.emplace(3, "Alice");
    c.emplace(1, "Bob");
    c.emplace(4, "Carol");

    // キー値2を持つ要素が、何番目に大きいかを取得する
    auto it = c.emplace(2, "Hoge").first;
    std::size_t n = c.rank(it);
    std::cout << n << std::endl; // 1

    // キー値4の要素が、何番目に大きいかを取得する
    std::cout << c.find_rank(4) << std::endl; // 3

    // 最後尾にある要素へのイテレータを取得する
    std::cout << c.nth(c.size() - 1)->name << std::endl; // Carol
}

ランク用インタフェースのほかに、mapと同じくイテレータを扱うfind()lower_bound()のインタフェースも持っています。

Boost 1.59.0のリリースノート翻訳をはじめました

C++

いつものように、boostjpサイトで、リリースノートの翻訳をやっています。

Boost.勉強会 #17 東京を開催しました

C++

発表資料は、上記ページにまとめてあります。

東京での開催は、1年2ヶ月ぶりとなりました。最近だいぶ気持ちが落ち込んでいて、当日の朝まで非常に憂鬱な状態だったのですが、参加者のみなさんの熱気で、おかげさまで回復できました。

またネタがたまってきた頃にでも開催しますので、何か発表ネタがある方は「今度こういう発表したい」のような連絡をいただけると、開催しやすいです。

C++14対応のC++ポケットリファレンス 第2版

C++ Book

おかげさまでご好評いただいております書籍『C++ポケットリファレンス』ですが、この度、C++規格の最新バージョンC++14(ISO/IEC 14882:2014)に対応した改訂版を出版します。

基本文法、ライブラリの各章において、C++14で追加された機能の解説を加筆しました。

また、それ以外の項目についても、解説の加筆や改善を行っています。

ページ数も16ページほど増量し、544ページになっています。そろそろポケットに収納するのは厳しいかもしれません。

コンパイラC++14への対応も非常に早いので、より多くの方にC++14の機能を使っていただければ幸いです。

C++ポケットリファレンス』第2版は、2015年6月4日に発売予定です。電子書籍版は、技術評論社Digital Publishingサイトで販売を予定しています。

追記

PDF版はこちらです:

gihyo.jp

Boost.勉強会 #17 東京の募集を開始しました

C++

2015/05/30(土)に、Boost.勉強会 東京を開催します!

Boost 1.58.0がリリースされました

C++

いつものように、boostjpサイトで、リリースノートの日本語訳を作成して公開しています。

新ライブラリ

今回の新ライブラリは、以下の2つです。

  • Endian
    • プロセッサのエンディアンに関係なく、適切なバイトオーダーに変換する型と関数。
  • Sort
    • 一般的な状況でO(n*log(n))よりも高速な、ハイブリッドな基数ソートであるスプレッドソート(spreadsort)を含む。

主な更新内容

更新はたくさんありますが、目立ったところをいくつか列挙します。

  • Boost.Fusionのstd::tupleアダプトが正式サポートになった
    • Flastさんががんばってpull requestを送りまくってくれました。お疲れさまでした。
  • Boost.Variantのapply_visitor()関数に、ジェネリックラムダを指定できるようになった。
    • C++14サポートです。
  • Boost.Geometryの、disjoint()intersects()がサポートする組み合わせが増えた
  • Boost.Containerに、small_vectorというコンテナが追加された
    • 小さな要素数に最適化されたvector。テンプレートパラメータで指定された要素数の領域を事前に確保することにより、その要素数を超えない限り、insert()push_back()でメモリ確保を行わない。
    • static_vectorとは異なり、フリーストアからメモリ確保し、キャパシティを超えた領域の拡張が可能。
    • LLVMのSmallVectorクラスを参考にしている
  • Boost.Containerのランダムアクセスイテレータをサポートするコンテナに、nth()index_of()メンバ関数が追加された。