Heim >Backend-Entwicklung >C++ >Wie kann ich die Einfügereihenfolge in einer Karte beibehalten und gleichzeitig effiziente Suchvorgänge aufrechterhalten?

Wie kann ich die Einfügereihenfolge in einer Karte beibehalten und gleichzeitig effiziente Suchvorgänge aufrechterhalten?

Susan Sarandon
Susan SarandonOriginal
2024-12-03 16:17:11432Durchsuche

How Can I Preserve Insertion Order in a Map While Maintaining Efficient Lookups?

Einfügungsreihenfolge in einer std::map beibehalten

In Situationen, in denen die Einfügungsreihenfolge entscheidend ist, reicht es möglicherweise nicht aus, sich ausschließlich auf eine std::map zu verlassen. Wenn die Beibehaltung der Einfügereihenfolge Priorität hat, gibt es alternative Ansätze, die in Betracht gezogen werden sollten.

Eine Möglichkeit besteht darin, den Inhalt der Karte in einen std::vector zu konvertieren, bevor seine Werte iteriert und gedruckt werden. Durch die Nutzung eines geeigneten Funktors können Sie std::sort verwenden, um die Elemente basierend auf ihrer Einfügereihenfolge anzuordnen.

Wenn jedoch schnelle Suchvorgänge unerlässlich sind (z. B. 10 Millionen Mal), kann die Verwendung eines Vektors zu Leistungseinbußen führen Anliegen. Für solche Szenarien bietet die Bibliothek boost::multi_index eine Lösung, die die Effizienz einer Karte mit der Flexibilität mehrerer Indizes kombiniert.

Verwendung von boost::multi_index:

Mit dieser Bibliothek können Sie mehrere Indizes für jeden Container erstellen. In diesem speziellen Fall können Sie eine value_t-Struktur mit String- und Int-Mitgliedern definieren und zwei Indizes verwenden:

  1. Zufallszugriff: Stellt die Einfügereihenfolge dar
  2. Hashed Unique: Indiziert das String-Mitglied, um eine schnelle Arbeit zu ermöglichen Suchvorgänge

Sie können dann einen multi_index_container wie folgt instanziieren:

struct value_t {
    string s;
    int i;
};

struct string_tag {};

typedef multi_index_container<
    value_t,
    indexed_by<
        random_access<>, // insertion order
        hashed_unique<tag<string_tag>, member<value_t, string, &value_t::s>>
    >
> values_t;

Dieser Ansatz ermöglicht effiziente Suchvorgänge und behält gleichzeitig die Einfügereihenfolge bei der Iteration des Containers bei.

Das obige ist der detaillierte Inhalt vonWie kann ich die Einfügereihenfolge in einer Karte beibehalten und gleichzeitig effiziente Suchvorgänge aufrechterhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn