2008/11/12

Visual C++はSTLのStrict Weak Orderingルールを検査してくれます

STLの比較関数には、等しい値が渡されたときには、falseを返さなければならない、というルールがあります。

これは、「Strict Weak Orderingルール」と呼ばれ、例えば、SGI のStandard Template Library Programmer's Guideにも、Strict Weak Orderingという専用のページが存在しています。また、Effective STLでは、第21項に「等しい値に対して比較関数が常にfalseを返すようにしよう」という、そのものズバリの項目があります。

にも関わらず、私は、この件をすっかり忘れており、自分のコードの比較関数で、等しい値に対して true を返していました...。

この間違いが発覚したのは、問題のコードをWindowsのVisual C++ 2005でコンパイルして実行した時。普段はgccを使っていますが、マルチプラットフォーム対応の一環で、自分のコードをWindows上でも動作するようにしました。

すると、なんと Visual C++ では、debug モードが有効になっている場合、STLの比較関数呼び出し実行時、引数の前後を入れ替え、必ずどちらかが false になることを調べてくれるのです! 私のコードでは、何れに於いても true を返すことになりますから、このチェックに引っかかり、無事に問題を発見することが出来ました。

Visual C++を(少しだけ)見直した瞬間でした。感謝。

...べ、べつに、VC++に惚れたわけじゃ、ないんだからねっ!



広告
Effective STL―STLを効果的に使いこなす50の鉄則

0 件のコメント:

コメントを投稿