配列中に最も小さな値が複数存在する時の min_element の挙動

規格では最初に見つかった反復子 (Iterator) が返るようになっているため、下記のようなコードには悲しい結果が待っている。

#include 
#include 
int main(int, char*)
{
    double data = { 5, 4, 3, 2, 1, 1 };
    double* last = data + sizeof(data) / sizeof(data[0]);

    assert(last - 1 == std::min_element(data, last)); // ここで死ぬ
    assert(data == std::max_element(data, last)); // これはいいんだけど...
    return 0;
}

人から貰った DLL を使ったプログラムを書いているときに、同じ値が複数含まれる配列を渡すと assert で落っこちるのでソースを見てみたら、上記のようなことをやっていた。みんなも気をつけよう!