Шаблоны и оператор C ++ для логики: B содержится в множестве A - PullRequest
0 голосов
/ 07 апреля 2010

В C ++ я ищу реализацию оператора для выбора элементов в списке (типа B) на основе того, что B полностью содержится в A.

В книге "Логическое проектирование цифровых компьютеров".Монтгомери Фистер-младший (опубликовано в 1958 г.), стр. 54, гласит:

F11 = A + ~ B имеет две интересные и полезные ассоциации, причем ни одна из них не имеет ничего общего с компьютерным дизайном.Первая - это логическая запись импликации ... Вторая - запись включения ... Это может быть выражено знакомым отношением, B

Моя первоначальная реализация была на C. В список были переданы обратные вызовы для использования для таких операций.Примером является список целых чисел и структура, содержащая два целых числа, минимальное и максимальное, для целей выбора.

Там выбор будет основываться на B> = A-> min && B <= A->макс.

Используя C ++ и шаблоны, как бы вы подошли к этому после реализации универсального списка в C с использованием пустых указателей и обратных вызовов?

Использует <в качестве перегруженного оператора для таких целей... <ugh>зло?

(или используя класс B для критериев выбора, осуществляя сравнение путем перегрузки>?)

edit: моя реализация узлов длясписок содержит элемент для пометки выбора элемента или нет.

в отношении наборов и уникальности, данные в списке, скорее всего, будут содержать элемент, определяющий позицию вдоль временной линии, учитывая, что это один из основных элементов выборакритерии, использование набора терминов может вводить в заблуждение, поскольку не существует гарантированной уникальности в отношении положения на временной шкале, то есть события могут происходить одновременно.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2010

Способ, которым это делается повсеместно в стандартной библиотеке, состоит в том, что два имеют шаблонный параметр, который может принимать функцию / функтор и который используется для сравнений:

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

Некоторые примеры из стандартной библиотеки будут remove_if или lower_bound.

(Также учтите, что в стандартной библиотеке уже есть шаблон класса set и такие алгоритмы, как set_intersection)

0 голосов
/ 07 апреля 2010

ИМО, использование «<» было бы злом. Если это не вычисляет "меньше чем", это, вероятно, неправильное использование. </p>

В этом случае я бы смоделировал мою реализацию после 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;
}
...