2010-02-24 24 views
5

Ich habe ein Std :: Set mit der Compare-Klasse, die zusätzliche Parameter benötigt, um Schlüssel zu vergleichen. Dieser variable Parameter wird in der Laufzeit festgelegt und ich packe ihn in die Schlüssel des Sets, um es für Compare zugänglich zu machen.Weitergabe von Daten an Std: Set Vergleichsklasse

Der Parameter gehört jedoch logisch zu der Menge und nicht zu den Schlüsseln, daher sieht diese Lösung umständlich aus und dupliziert den gleichen Wert über alle Schlüssel.

Gibt es eine elegante Möglichkeit, zusätzliche Parameter an die Compare-Klasse zu übergeben? (Ich dachte zuerst über set :: value_comp nach, aber es gibt Objekt nach Wert zurück, während ich eine Referenz brauche).

Danke.

Antwort

0

Die Definition von std :: set ist:

template < 
     class Key, 
     class Traits=less<Key>, 
     class Allocator=allocator<Key> 
> 
class set 

So Traits ist, sollte Ihr Vergleichsoperator, aber wenn im Konstruktor aussehen würde, können Sie es dort wieder sehen:

explicit set(
    const Traits& _Comp 
); 

Übergeben Sie Ihre Instanz einfach an den Konstruktor. (Beachten Sie, dass es durch Kopieren gemacht wird)

+0

Diese Antwort ist korrekt, aber ich fand es schwer zu folgen. Um dies zu verdeutlichen: Sie müssen ein Vergleichsobjekt mit den zusätzlichen Parametern innerhalb erstellen und dieses Objekt dann an den Konstruktor std :: set übergeben. Versuchen Sie nicht, die Parameter zu ändern, nachdem das Set erstellt wurde. –

+0

@Mark Ransom - es gibt keine Silberkugel, wenn die Regel der Sortierung geändert wird, dann muss der gesamte Satz neu aufgebaut werden. Wenn die Parameter die Sortierreihenfolge nicht beeinflussen, können Sie sie per Verweis oder Zeiger an Traits übergeben. – Dewfy

+0

Es gibt keine Möglichkeit, ein Set neu zu erstellen, außer es in ein neues zu kopieren, also stehe ich zu meiner Aussage. Das Vergleichsobjekt muss immer den gleichen Wert zurückgeben, wenn der gleiche Satz von Eingängen angegeben wird, andernfalls kann der Satz eine Fehlfunktion aufweisen. –

Verwandte Themen