Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengekalkan Susunan Sisipan dalam `std::map` Semasa Mengekalkan Carian Cekap?

Bagaimana untuk Mengekalkan Susunan Sisipan dalam `std::map` Semasa Mengekalkan Carian Cekap?

Linda Hamilton
Linda Hamiltonasal
2024-12-06 09:37:11206semak imbas

How to Maintain Insertion Order in a `std::map` While Preserving Efficient Lookups?

Mengekalkan Susunan Sisipan dalam std::map

Dalam senario di mana std::map gagal mengekalkan susunan sisipan, timbul keperluan untuk bekas yang mengekalkan sifat kritikal ini. Semasa std::vector> kelihatan seperti alternatif yang berdaya maju, penalti prestasinya untuk carian kerap dan operasi kenaikan menimbulkan keraguan tentang kesesuaiannya.

Satu penyelesaian yang berkesan ialah menggunakan gabungan std::map dan std::vector. Memandangkan peta memastikan carian berasaskan rentetan yang cekap, anda boleh menyalin kandungan peta ke dalam std::vector sebelum melakukan operasi isihan. Functor tersuai boleh digunakan untuk mentakrifkan logik pengisihan berdasarkan susunan sisipan.

Sebagai alternatif, perpustakaan Boost menawarkan penyelesaian berkuasa dengan boost::multi_index. Ini membolehkan pengindeksan berbilang bagi satu bekas. Dalam kes anda, struktur berikut boleh dilaksanakan:

struct value_t {
  std::string s;
  int i;
};

struct string_tag {};

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

Di sini, indeks random_access mengekalkan susunan sisipan manakala indeks hashed_unique memastikan pengecam rentetan unik untuk carian yang cekap. Pendekatan ini menyediakan kedua-dua carian yang cekap dan pemeliharaan susunan sisipan.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Susunan Sisipan dalam `std::map` Semasa Mengekalkan Carian Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn