2010-02-24 12 views
5

Mam zestaw std :: set z klasą Compare, która wymaga dodatkowego parametru do porównania kluczy. Ten parametr zmienny jest określany w czasie wykonywania i pakuję go wewnątrz kluczy zestawu, aby był dostępny dla porównania.przekazywanie większej ilości danych do std: set Klasa porównania

Jednak parametr logicznie należy do zestawu, a nie do kluczy, więc to rozwiązanie wygląda na niezręczne i duplikuje tę samą wartość dla wszystkich kluczy.

Czy istnieje elegancki sposób przekazywania dodatkowego parametru do klasy Porównaj? (Najpierw myślałem o set :: value_comp, ale zwraca on porównywać obiekt według wartości, a ja potrzebuję referencji).

Dzięki.

Odpowiedz

0

Definicja std :: set jest:

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

Tak Cechy to powinien być twój operator porównania, ale gdyby spojrzeć na konstruktora, można je zobaczyć jeszcze raz:

explicit set(
    const Traits& _Comp 
); 

Po prostu przekaż swoją instancję do konstruktora. (Zauważ, że robi się to poprzez kopiowanie)

+0

Ta odpowiedź jest poprawna, ale ciężko mi było na nią patrzeć. Aby wyjaśnić: musisz utworzyć obiekt porównania z dodatkowymi parametrami wewnątrz, a następnie przekazać ten obiekt do konstruktora std :: set. Nie próbuj modyfikować parametrów po skonstruowaniu zestawu. –

+0

@ Mark Ransom - nie ma srebrnej kuli, jeśli zmieni się zasada sortowania, cały zestaw musi zostać odbudowany. Jeśli parametry nie wpływają na porządek sortowania, możesz przekazać go do Cechy przez odniesienie lub wskaźnik. – Dewfy

+0

Nie ma sposobu na odbudowanie zestawu, poza skopiowaniem go na nowy, więc podtrzymuję moje oświadczenie. Obiekt porównawczy musi zawsze zwracać tę samą wartość, gdy otrzymuje ten sam zestaw danych wejściowych, w przeciwnym razie zestaw może wadliwie działać. –

Powiązane problemy