Ist es möglich, Elemente eines anderen Typs als die in einem std :: set enthaltenen zu verwenden, um eine Suche und Löschung durchzuführen?

Angenommen, ich habe Folgendes:

struct MetadataThingy {

    void *actual_thingy;
    int some_metadata;
    int more_metadata;

    bool operator<(MetadataThingy const& other) const {
        return actual_thingy < other.actual_thingy;
    }

};

woheractual_thingy weist auf einige wichtige Daten hin und ich möchte den Container nach dem Wert von geordnet habenactual_thingy Statt des Werts des Elements, auf das verwiesen wird, muss ich jedoch einige andere Daten darüber speichern. Deshalb habe ich die Wrapper-Klasse erstelltMetadataThingy mit einem Komparator, der nur den Wert der berücksichtigtactual_thingy Zeiger (anstatt einen Container vonvoid *)

Geben Sie nun den folgenden Code ein:

std::set<MetadataThingy> thingy_set;

void test() {

    MetadataThingy m1 { nullptr, 5, 20 };
    MetadataThingy m2 { &m1, 1, 2 };
    MetadataThingy m3 { &m2, 6, 0 };

    thingy_set.insert(m1);
    thingy_set.insert(m2);
    thingy_set.insert(m3);

    MetadataThingy m;
    m = *thingy_set.find(m2); // OK.
    m = *thingy_set.find(static_cast<void *>(&m2)); // Nope. Can't use a pointer.

}

Seit jederMetadataThingy kann durch den gespeicherten Zeigerwert eindeutig identifiziert werden und ist nach dem Zeigerwert geordnet. Es wäre sinnvoll, Objekte einfach mit a zu finden / löschenvoid * als Schlüssel. Nach dem derzeitigen Stand müsste ich jedoch einen Dummy erstellenMetadataThingy Jedes Mal suche ich nach einem Element, das sich wirklich klobig anfühlt. Ich habe schon darüber nachgedacht, nur einemap mit Zeigern als Schlüssel undMetadataThingy als wert aber da jederMetadataThingy Muss der Zeiger auch sowieso enthalten, fühlt sich das etwas überflüssig an. So,Gibt es eine Möglichkeit, ein Element eines anderen Typs als des in einer Gruppe gespeicherten zu verwenden, um Werte in der Gruppe zu suchen oder zu löschen, vorausgesetzt, die Elemente der beiden Typen sind miteinander vergleichbar und dass Elemente eines Typs eindeutig dem anderen zugeordnet werden können (void * undMetadataThingy sind isomorph)? (Ich habe keine in den obigen Code aufgenommen, aber nehme an, es gibt Operatorüberladungen zum Vergleichenvoid * undMetadataThingy In irgendeiner Reihenfolge.)

Ein kleiner Hintergrund zu dem Problem, das ich zu lösen versuche, nur für den Fall, dass jemand einen besseren Ansatz empfehlen kann: Ich muss eine Sammlung nach mehreren Kriterien bestellen, damit ich mehrere habeMetadataThingy Container, alle nach unterschiedlichen Kriterien sortiert. "Metadaten" sind in diesem Fall Dinge, die ich brauche, um die Positionen der Elemente in allen Containern zu verfolgen, damit ich sie schnell entfernen kann. Das klingt nach einem perfekten Job für Boost-Container mit mehreren Indizes, aber die Reihenfolge dieser Elemente ändert sich ständig, was AFAIK bedeutet, dass es nicht funktioniert.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage