2013-04-10 8 views
13

boostや他の一般的なC++ライブラリでは、semiringまたはmonoid抽象クラス(テンプレートクラスなど)を提供していますか?C++には、半透明またはモノイドの標準抽象化はありますか?

私はこれらの抽象的な構造に関して表現したいいくつかのアルゴリズムを持っていますが、これまで何も出てこなかったのです。私は自分自身を書くことができますが、理想的には、私は既にブーストのようなものを使っている図書館にいます。

ありがとうございます!

+1

うわー、私はこれらの言葉が実生活の問題に適用されているとは思っていませんでした。彼らは大学の学生を拷問するために予約されていたと仮定しました。 +1そのために: – dasblinkenlight

+0

@ dasblinkenlight私が実装したいアルゴリズムの1つは、Cormenらのアルゴリズムの書籍で、半順序とモノイドの点で書かれています:) –

+0

ああ、これらの男...控えめな表現のための彼らの才能は、 "アルゴリズムの概要"ではなく、アルゴリズムについての知識が必要です:) :) :) :) – dasblinkenlight

答えて

9

SGI STLMonoidOperationという概念を持っています。例えば、MonoidOperationには、power関数が実装されています。

Boost.GraphライブラリもMonoid conceptと定義されています。

already suggestedElements of Programmingに加えて、あなたは、アレクサンダー・ステパノフ(EOPの著者の一人)によってNotes on Programmingに見えるかもしれません。 注:は無料でご利用いただけ、EoPと一部重複しています。 EOPは数学の教科書のような非常に簡潔であるが、ノートは、より多くの「非公式」です - -ノート EOP 間と

は、スタイルの違いがありますがいくつかの小さな話などによって

両方とも、上で参照されたいくつかの議論を有する関数の実装。

P.S.

P.P.S.:アレクサンダー・ステパノフによって素晴らしい講演がありますCollected Papers of Alexander A. Stepanov

7

私の知る限りでは、C++標準ライブラリはこれらの構造の周囲に抽象概念を持っていません。しかし、STLの発明者であるAlex Stepanovは、Elements of Programmingという本を書いており、monoids、グループ、バイナリ演算子、単項関数などを扱うさまざまな便利な関数を書いています。これは必ずしも標準ではありませんが、さらなる探査の出発点となります。

希望すると便利です。

3

Boost.Operatorsは、クラスの算術演算子のグループを定義する便利な方法を提供します。

あらかじめ定義された概念(構文ダックタイピングのみ)には、リング、順序付きリング、ユークリッドリング、順序付きユークリッドリング、フィールドおよび順序付きフィールドが含まれます。あなたは、オペレータクラスの適切なグループから派生することによって、セミリングまたはモノイドのための独自のクラスを定義することができるはずです。

+0

これは概念ではなく、あなたが言ったように「算術演算子のグループ」のヘルパーです。コンセプトには、Additive_Identity、Multiplicative_Identity、Additive_Inverse、Multiplicative_Inverseなどが含まれます。 –

+0

@EvgenyPanasyuk tnx、実際にはboost.operatorsは識別要素を提供していないようです。 AFAICSでは、同じ「友人」注入トリックを使用することが可能でなければなりません。例えば。テンプレートをMultIdクラス:フィールド {}; 'に置き換えて、可換性を反映するように混合した' operator * 'バージョンを定義します。 – TemplateRex

+0

概念はインターフェイスに焦点を当てています。つまり、どの構文が合法で、どの意味があるかです。これは、具体的なモデルから抽象化されたアルゴリズム(およびその他のもの)の実装を可能にします。しかし、Boost.Operatorsは、具体的なモデルの実装を支援するヘルパーです。 –

関連する問題