как сравнить два std :: set?
Я делаю такое сравнение двух std::set
#include <cstdlib>
#include <cstdio>
using namespace std;
#include <vector>
#include <set>
int main(int argc, char** argv)
{
int myints1[]= {10,20,30,40,50};
int myints2[]= {50,40,30,20,10};
std::set<int> s1 (myints1,myints1+5);
std::set<int> s2(myints2,myints2+5);
if(s1==s2){
printf("sets: true");
}else printf("sets: false");
std::set<int>::iterator it2=s2.begin();
for(std::set<int>::iterator it1=s1.begin();it1!=s1.end();it1++){
printf("\ns1: %d s2: %d",*it1,*it2);
it2++;
}
}
вывод:
sets: true
s1: 10 s2: 10
s1: 20 s2: 20
s1: 30 s2: 30
s1: 40 s2: 40
s1: 50 s2: 50
Вопрос:
Правильно ли это? Или любой другой (специальный) способ сравнения двух наборов?
Ответы
Ответ 1
Да, operator==
правильно определен для всех стандартных контейнеров (за исключением неупорядоченных контейнеров - на основе стандарта 23.2.5.2 стандарта) и, как правило, выполняет лексикографическое сравнение. См. Например, здесь. Соответствующая цитата:
Проверяет, равно ли содержание lhs и rhs, то есть lhs.size() == rhs.size(), и каждый элемент в lhs имеет эквивалентный элемент в rhs в той же позиции.
Поскольку std::set
является упорядоченным контейнером, любой набор с одинаковым размером и одинаковыми элементами (при условии, что компараторы одинаковы) обязательно будет иметь их в одной и той же позиции, следовательно, будет сравниваться с равным.
Ответ 2
В C++ стандартном библиотечном заголовке <algorithm>
имеется несколько заданных операций.
std::set_difference
дает те элементы, которые находятся в наборе 1, но не установлены 2.
std::set_intersection
дает те элементы, которые находятся в обоих наборах.
std::set_symmetric_difference
дает те элементы, которые появляются в одном из наборов, но не оба.
std::set_union
дает те элементы, которые находятся либо в наборе 1, либо в наборе 2.
Алгоритмы, описанные выше, могут также применяться к контейнерам STL, отличным от std::set
, но контейнеры должны быть отсортированы сначала (по умолчанию std::set
сортируется).
Ответ 3
Другой способ:
template<typename Set>
bool set_compare(Set const &lhs, Set const &rhs){
return lhs.size() == rhs.size()
&& equal(lhs.begin(), lhs.end(), rhs.begin());
}
Вдохновленный от элегантного ответа здесь.