Требуется написать функцию пересечения двух множеств, но возникла проблема, как проверять, что в одном множестве есть данный элемент а в другом нет? Нашел функцию find()
, но она возвращает итератор с указанием на элемент множества. А если данного элемента нет, то что тогда она вернет?
Если не годится готовая 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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Необходимо отобразить 2D график (до 5 млнвещественных точек) в виде кривой
Как эффективно найти количество способов покрыть матрицу n * m прямоугольниками 2x2, 1x2, 2x1 так, чтобы все клетки были заняты и прямоугольники...