0

C++ では、B が完全に A に含まれていることに基づいて、(タイプ B の) リスト内の項目を選択するための演算子を実装しようとしています。

Montgomery Phister jr (1958 年発行) による書籍「デジタル コンピュータの論理設計」の p54 には、次のように書かれています。

F11 = A + ~B には、興味深く有用な 2 つの関連性がありますが、どちらもコンピューターの設計とはあまり関係がありません。1 つ目は含意の論理表記法です... または、「B は A に含まれる」というステートメントによって。またはブール式 F11= A + ~B = 1 によります。

私の最初の実装は C でした。コールバックは、そのような操作に使用するリストに与えられました。例としては、int のリストと、選択目的で min と max の 2 つの int を含む構造体があります。

そこでは、B >= A->min && B <= A->max に基づいて選択が行われます。

C++ とテンプレートを使用して、void ポインターとコールバックを使用して C でジェネリック リストを実装した後、これにどのようにアプローチしますか?

< をそのような目的でオーバーライドされた演算子として使用しています... <ugh> 悪ですか? </ug>

(または、選択基準にクラス B を使用し、オーバーロード > ? による比較を実装する)

編集:リストのノードの私の実装には、アイテムの選択にフラグを立てるかどうかのメンバーが含まれています。

セットと一意性に関して、リスト内のデータには、時間軸に沿った位置を指定するメンバーが含まれる可能性があります。これが主な選択基準の 1 つであることを考えると、位置に関して一意性が保証されていないため、セットという用語を使用すると誤解を招く可能性があります。タイムラインに沿って - つまり、イベントは同時に発生する可能性があります。

4

2 に答える 2

3

これが標準ライブラリのいたるところで行われる方法は、関数/ファンクターを受け取ることができ、比較に使用されるテンプレート化されたパラメーターを2つ持つことです。

template<typename Predicate>
void container::select(Predicate p) {
   if (p(items[0])) {
     // something
   }
}

標準ライブラリのいくつかの例は、remove_ifまたはlower_bound.

(また、標準ライブラリには既にsetクラス テンプレートがあり、 のようなアルゴリズムがあることに注意してくださいset_intersection)

于 2010-04-07T00:56:05.427 に答える
0

IMO、「<」を使用するのは悪いことです。「未満」を計算しない場合は、おそらく誤用です。

この場合、STL に従って実装をモデル化します。これがまさにあなたが求めているものかどうかはわかりませんが、テストされていませんが:

編集:コンパイルおよびテスト済み:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
#include <ext/functional>

using namespace std;
using __gnu_cxx::compose2;

int main(int argc, char** argv) {
  vector<int> list_of_b;
  vector<int> included_in_a;

  int min = 2;
  int max = 5;
  remove_copy_if(list_of_b.begin(), list_of_b.end(),
                 back_inserter(included_in_a),
                 not1(compose2(logical_and<bool>(),
                               bind2nd(greater<int>(), min),
                               bind2nd(less<int>(), max))));
  copy(included_in_a.begin(), included_in_a.end(),
       ostream_iterator<int>(cout, "\n"));
  return 0;
}
于 2010-04-07T01:01:39.320 に答える