stl — C ++ ленивый способ найти объединение std :: sets

Я хочу найти объединение двух наборов, то есть сложить их вместе. Я в курсе .insert() а также std::set_union(), но, насколько я могу судить, они требуют, чтобы сначала получить итератор в начале и конце второго набора (или хуже для set_union()). Было бы хорошо, если бы я мог сделать что-то вроде + а также +=; кажется, что это было бы довольно очевидной особенностью для класса, который реализует математическую концепцию множества. Какой самый простой способ сделать это?

0

Решение

Я не знаю ни одного способа упростить его с помощью существующих методов C ++.

Один из способов упростить алгоритмы контейнеров, которые работают со всем контейнером, — обернуть их в шаблонный метод, принимающий контейнер:

template <typename T>
void my_union(const T& cont1, const T& cont2, T& cont3)
{
// Make the union and store the result in cont3
}

Если вы хотите иметь оператор для этого, вы можете легко определить его самостоятельно:

template <typename T>
inline set<T>& operator+=(set<T>& lhs, const set<T>& rhs)
{
lhs.insert(begin(rhs), end(rhs));
return lhs;
}

template <typename T>
inline set<T> operator+(set<T> lhs, const set<T>& rhs)
{
lhs += rhs;
return lhs;
}

int main() {
set<int> a = {1, 2, 3   };
set<int> b = {   2, 3, 4};

a += b;

for (auto i : a)
cout << i << " ";

return 0;
}

Приведенный выше пример напечатает 1 2 3 4 на консоль.

2

Другие решения

Других решений пока нет …

Похожие вопросы
Добавить ответ
Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Нажимая кнопку «Отправить», я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности этого сайта.