создать функцию объединения, которая возвращает тип набора <int> - PullRequest
0 голосов
/ 01 марта 2019

У меня проблемы с завершением функции, в настоящее время моя программа не позволяет использовать cout, когда я вызываю ее в main.Я пытаюсь найти альтернативный способ создания определения функции для:

set<int> Union(const set<int> & s0, const set<int> & s1);

, который создает и возвращает набор, который является объединением двух других наборов (s0 и s1).То, что я написал (функция пытается использовать метод set_union из #include) и желаемый результат ниже:

Желаемый результат: данный набор s0 имеет {1,2,3,4}, а набор s1 имеет {4,5,6,7}, должен быть создан новый набор (s3 с {1,2,3,4,5,6,7}).Вся помощь приветствуется.

#include <iostream>
#include <string>
#include <set>
#include <cassert>
#include <algorithm>
using namespace std;
set<int> Union(const set<int> & s0, const set<int> & s1);
int main(){
set<int> s0{1,2,3,4};
set<int> s1{4,5,6,7};
cout << Union(s0,s1) << endl;
}
set<int> Union(const set<int> & s0, const set<int> & s1) {
    set<int> s; 
    set_union(s0.begin(), s0.end(),
        s1.begin(), s1.end(),
        s, s.begin());
    return s;
}

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы должны использовать std::set_union с std::inserter следующим образом:

std::set<int> Union(const std::set<int> & s0, const std::set<int> & s1) {
    std::set<int> s; 
    std::set_union(s0.begin(), s0.end(),
        s1.begin(), s1.end(),
        std::inserter(s,s.begin()));

    return s;
}

И вам также нужно будет определить оператор выходного потока для std::set.

template <typename T> 
std::ostream& operator<<(std::ostream& os, const std::set<T>& v) 
{ 
    os << "["; 
    for (auto it : v) { 
        os << it; 
        if (it != *v.rbegin()) 
            os << ", "; 
    } 
    os << "]\n"; 
    return os; 
} 

См. демо здесь .

Примечание. Для компилятора MSVC необходимо включить заголовок <iterator> для использования std::inserter.

0 голосов
/ 01 марта 2019

Если вы можете использовать C ++ 17, для вас есть std::set::merge.Обратите внимание, что эта функция-член изменяет как объект, которому она принадлежит, так и аргумент функции.Следовательно, изменение сигнатуры функции Union таким образом, что копируются оба набора, имеет смысл для реализации, которая использует функцию merge:

std::set<int> Union(std::set<int> s0, std::set<int> s1) {
   s0.merge(std::move(s1));

   return s0;
}
...