2010-04-07 3 views
0

В C++, я ищу осуществить оператор для выбора элементов в списке (тип В) на основе B содержитс полностью в пределах А.шаблонов, и оператор С ++ для логики: B, содержащихся на множестве А

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

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

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

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

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

Использует < как переодетый оператор для таких целей ... <ugh> Зло? </тьфу >

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

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

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

ответ

3

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

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

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

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

+0

+1 для set_intersection.Алгоритмы стандартной библиотеки слишком часто игнорируются, и все же часто существует тот, который вполне подходит для того, что вы пытаетесь выполнить. –

+0

Возможно, мое использование набора терминов было неправильным в этом случае, список не обязательно будет содержать уникальные элементы (где уникальность основана на том, что выбирается). –

+0

, принятый для упоминания функторов, все еще думал о функциональных указателях. –

0

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

В этом случае я бы смоделировал свою реализацию после STL. Я не уверен, что это именно то, что вы после этого, и это не тестировалась, но:

Edit: скомпилирован & испытываться:

#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; 
} 
+0

Это не совсем то, что я после нет, но тогда я не упомянул, что класс, который я использую для узлов в списке, имеет член для отметки того, выбран ли элемент или нет (т. Е. Вы можете выбирать элементы, не удаляя их). –