Работа с множествами в С++

283
20 марта 2017, 10:14

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

Answer 1

Если не годится готовая set_intersection, то вот вариант ее реализации:

template<class InputIt1, class InputIt2, class OutputIt>
OutputIt set_intersection(InputIt1 first1, InputIt1 last1,
                          InputIt2 first2, InputIt2 last2,
                          OutputIt d_first)
{
    while (first1 != last1 && first2 != last2) {
        if (*first1 < *first2) {
            ++first1;
        } else  {
            if (!(*first2 < *first1)) {
                *d_first++ = *first1++;
            }
            ++first2;
        }
    }
    return d_first;
}

Если ваши множества отсортированы (например, если это реальные set), то это то, что нужно. Если под множеством вы понимаете, например, массив или вектор - сначала их отсортируйте.

Для... гм... новичков... разжевываю тут: http://ideone.com/fFbU9L

#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <set>
#include <iterator>
#include <cstring>
using namespace std;

int main()
{
    set<string> a{"aaa","bbb","ccc","ddd","eee","fff"};
    set<string> b{"ddd","eee","fff","ggg","hhh","iii"};
    set<string> res;
    set_intersection(a.begin(),a.end(),b.begin(),b.end(),
                     inserter(res,res.begin()));
    for(auto s: res) cout << s << endl;
    cout << "----------\n";
    set<const char*> c{"aaa","bbb","ccc","ddd","eee","fff"};
    set<const char*> d{"ddd","eee","fff","ggg","hhh","iii"};
    set<const char*> r;
    set_intersection(c.begin(),c.end(),d.begin(),d.end(),
                     inserter(r,r.begin()),[](const char*x,const char*y){ return strcmp(x,y) < 0; });
    for(auto s: r) cout << s << endl;
    cout << "----------\n";
    vector<const char*> e{"aaa","bbb","ccc","ddd","eee","fff"};
    vector<const char*> f{"ddd","eee","fff","ggg","hhh","iii"};
    sort(e.begin(),e.end(),[](const char*x,const char*y){ return strcmp(x,y) < 0; });
    sort(f.begin(),f.end(),[](const char*x,const char*y){ return strcmp(x,y) < 0; });
    vector<const char*> g;
    set_intersection(e.begin(),e.end(),f.begin(),f.end(),
                     back_inserter(g),[](const char*x,const char*y){ return strcmp(x,y) < 0; });
    for(auto s: g) cout << s << endl;
}
READ ALSO
Какую технологию/возможность/средство QT использовать для отображения 2D графика

Какую технологию/возможность/средство QT использовать для отображения 2D графика

Необходимо отобразить 2D график (до 5 млнвещественных точек) в виде кривой

311
Покрытие матрицы

Покрытие матрицы

Как эффективно найти количество способов покрыть матрицу n * m прямоугольниками 2x2, 1x2, 2x1 так, чтобы все клетки были заняты и прямоугольники...

256