Общий класс операций над множествами, то есть пересечение, объединение, минус и т. Д. - PullRequest
2 голосов
/ 09 июня 2011

Я хочу написать класс C ++, который предлагает операции над множествами, которые работают с векторами строк и векторами моего собственного типа данных.Существуют ли простые способы сделать это, вместо того, чтобы писать разные функции для каждого типа данных?До сих пор я написал операции для строковых векторов.Ниже приведен пример моего набора объединений:

vector<string> SetOperations::set_union(vector<string> set1,
                                        vector<string> set2) {
    for(std::vector<int>::size_type i = 0; i < set1.size(); i++) {
        set1.push_back(set2.at(i));
    }
    return set1;
}

Так что я хочу снова то же самое, но где string - это скажем my_data_type, который является структурой различных членов.Допустим, это выглядит так:

struct my_data_type {
    int label;
    vector<string> x;
    vector<string> y;
    string str;
};

Функция для каждого типа данных также не будет такой простой, как моя set_union(...) функция, потому что, безусловно, мне нужно будет проверить равенство для каждого члена my_data_typeв случае пересечения множеств?

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

Большое спасибо.

Ответы [ 2 ]

6 голосов
/ 09 июня 2011

Некоторые из них уже существуют и находятся в заголовке алгоритма:

  • set_union
  • set_difference
  • set_intersection
  • set_symmetric_difference

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

См .: http://www.cplusplus.com/reference/algorithm/

3 голосов
/ 09 июня 2011

Уже есть такие алгоритмы (объединение, пересечение, сортировка, ...): http://www.cplusplus.com/reference/algorithm/

Ваши элементы просто должны соответствовать требованиям для контейнерных элементов STL (см. http://msdn.microsoft.com/fr-fr/library/bb385469.aspx):

Все ссылочные типы, которые вставлены в контейнеры STL / CLR должны иметь как минимум, следующие элементы:

Открытый конструктор копирования.

Публичный оператор присваивания.

Публичный деструктор.

Кроме того, ассоциативные контейнеры такие как набор и карта должна быть публичной определен оператор сравнения, который оператор <по умолчанию. Некоторые операции на контейнерах может также потребоваться открытый конструктор по умолчанию и оператор публичной эквивалентности будет определены. </p>

Как и ссылочные типы, типы значений и обрабатывает ссылочные типы, которые должны быть вставленным в ассоциативный контейнер должен иметь сравнение оператор, такой как оператор <определено. Требования к публичной копии конструктор, публичное назначение оператор и публичный деструктор делают не существует для типов значений или дескрипторов к ссылочным типам. </p>

Вы можете найти информацию о перегрузке операторов (которая будет реализована в вашем пользовательском классе) на этом WikiBook: http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading

...