Как подсчитать, сколько элементов в двух множествах совпадают?
Есть два множества set. Нужно подсчитать, сколько элементов из этих множеств совпадают. К элементам множества нельзя обратиться так как к элементам массива или вектора. Значит, c помощью цикла это сделать не получится. Как это сделать иначе?
#include <iostream>
#include <vector>
#include <string>
#include <set>
using namespace std;
int count = 0;
string a;
string b;
set<string> a1;
set<string> b1;
void Check(set<string> a, set<string> b)
{
for(int k = 0; k< size(a); k++)
for(int q = 0; q<size(b); q++)
{
if(a[k] == b[q])
count = count+1;
}
}
int main() {
cin>>a;
cin>>b;
for(int i = 0; i< size(a); i++)
{
a1.insert(a[i]);
}
for(int j = 0; j<size(b); j++)
{
b1.insert(b[j]);
}
Check(a1, b1);
return 0;
}
Это мой код(неправильный, потому что неправильно обращаюсь к элементам множеств). Пользователь вводит две строки, эти строки вводятся в множества, а потом элементы сравниваются, подсчитывается количество равных элементов. Как сделать это правильно?
Ответы (3 шт):
Вот так вот:
#include <set>
#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>
int main() {
const std::set a = {1, 3, 5, 7},
b = {1, 3, 9, 4};
std::vector<int> intersection;
std::set_intersection(std::cbegin(a), std::cend(a),
std::cbegin(b), std::cend(b),
std::back_inserter(intersection));
std::cout << intersection.size() << '\n';
}
Почему же с помощью цикла не получится? Цикл по любому должен иметь место в том или ином алгоритме. Напишем свою функцию, вернувшую количество одинаковых элементов:
using std::set;
using std::string;
const unsigned
solution(const set<string>& a1, const set<string>& a2)
{
unsigned count = 0;
auto first1 = a1.begin(), first2 = a2.begin();
while (first1 != a1.end() && first2 != a2.end())
{
if (*first1 < *first2) {
++first1;
}
else
{
if (*first1 == *first2) {
++count;
++first1;
}
++first2;
}
}
return count;
}
Еще один вариант решения.
Если первое множество можно модифицировать, и для задачи удобно объединение, то при объединении можно считать сколько элементов совпадают, т.е. сколько элементов из второго множества не добавились в первое. Метод: emplace какраз возвращает пару итератор и bool, информирующий был ли вставлен объект?
const unsigned
solution2(set<string>& a1, const set<string>& a2 )
{
unsigned count = 0;
for (auto It = a2.begin(); It != a2.end(); ++It)
{
//если вставлен, ничего не делаем
if (a1.emplace(*It).second)
continue;
++count;
}
return count;
}