Soru iki std :: set nasıl karşılaştırılır?


Ben iki karşılaştırmayı yapıyorum 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++;
    }
}

çıktı:

sets: true
s1: 10  s2: 10
s1: 20  s2: 20
s1: 30  s2: 30
s1: 40  s2: 40
s1: 50  s2: 50

Soru:

Bunu yapmanın doğru yolu bu mu? Ya da iki seti karşılaştırmanın başka (özel) bir yolu var mı?


25
2018-04-24 03:39


Menşei


Eğer std::set uygular operator== Doğru olmasını beklerdim. - Mark Ransom
Elemanları belirlemek için bir yol arıyorsanız s1 ve s2 yap değil ortak olmalı, bakmak isteyebilirsiniz std::set_symmetric_difference itibaren <algorithm> başlığı. - jogojapan
Ben = s1 == s2 operatör == kullanıyorum, eğer evet eğer doğruysa, lütfen cevap vereceğim, alternatif olarak nasıl yapılmalı diye soruyorum.
@DrewDormann Güzel bir şekilde bakma ... her neyse, çok geç ... - jogojapan
hayır, asla geç kalmayın!


Cevaplar:


Evet, operator== tüm standart kaplar için doğru tanımlanmıştır (dışında Sırasız kaplar - standardın 23.2.5.2 'sine dayanır) ve genellikle sözlüksel bir karşılaştırma yapar. Örneğin bakınız İşte. İlgili alıntı:

Lhs ve rhs içeriğinin eşit olup olmadığını, yani lhs.size () == rhs.size () olup olmadığını ve lhs'deki her öğenin rhs'de aynı konumda eşdeğer bir öğeye sahip olup olmadığını kontrol eder.

Dan beri std::set sipariş edilen bir konteynırdır, aynı büyüklükte ve aynı elemanlarda (karşılaştırıcıların aynı olduğu göz önüne alındığında) herhangi bir set, onları aynı konumda olmalıdır, dolayısıyla eşit olarak karşılaştırır.


34
2018-04-24 04:06



ama aynı elementlere sahip iki set fakat matematiksel olarak farklı pozisyonlarda eşittir. Onlar da std :: set == eşit mi? Bence evet, ama yinelemeli ve comapre bizi yanıltıcı sonuçlara götürür
@gumtree std::set öğeleri eklediğiniz sırada tutmaz. Onları sıralar. Yani, yinelenen tıpkı == çalışır (ve std::equal Aynı şekilde çalışır. - jogojapan
@gumtree İşte bu nokta - set (ikinci şablon argümanı bir karşılaştırma operatörüdür) emredilir, dolayısıyla aynı karşılaştırıcıya ve aynı elemanlara sahip iki takım yapamam onları farklı pozisyonlarda bulundurun. - Yuushi
Tamam çok teşekkür ederim
Sırasız konteynerler de var operator== (görmek İşte ya da daha iyisi, İşte) - rubenvb


C ++ standart kitaplık üstbilgisinde birkaç ayarlanmış işlem var <algorithm>.

std::set_difference set 1'de olan ancak set 2 olmayan elemanları verir.

std::set_intersection her iki kümede bulunan elemanları verir.

std::set_symmetric_difference kümelerden birinde görünen ancak her ikisini de içermeyen öğeleri verir.

std::set_union set 1 veya set 2'de olan öğeleri verir.

Yukarıdaki algoritmalar, diğer STL kaplarına da uygulanabilir. std::setama önce kaplar sıralanmalıdır (std::set varsayılan olarak sıralanır).


17
2017-09-25 14:14





Başka bir yol bu olurdu:

template<typename Set>

bool set_compare(Set const &lhs, Set const &rhs){
    return lhs.size() == rhs.size() 
        && equal(lhs.begin(), lhs.end(), rhs.begin());
}

Zarif cevaptan ilham alındı İşte.


1
2017-11-22 04:31