Подтвердить что ты не робот

как сравнить два 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

Вопрос:

Правильно ли это? Или любой другой (специальный) способ сравнения двух наборов?

4b9b3361

Ответ 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());
}

Вдохновленный от элегантного ответа здесь.