Rumah >pembangunan bahagian belakang >C++ >Bolehkah Anda Mengakses Bekas Dasar Penyesuai Bekas STL?
Akses Bekas Dasar Penyesuai Bekas STL
Pustaka STL menyediakan pelbagai penyesuai bekas, seperti tindanan, baris gilir dan baris gilir keutamaan. Penyesuai ini menawarkan antara muka untuk berinteraksi dengan bekas asas, tetapi timbul persoalan: adakah terdapat cara piawai untuk mengakses lapisan tersembunyi ini?
Kekurangan Kaedah Capaian Standard
Malangnya, STL tidak mentakrifkan kaedah standard untuk mendapatkan semula bekas asli tindanan, baris gilir atau priority_queue. Fungsi _Get_container() tersedia dalam pelaksanaan tertentu, seperti VS2008, adalah khusus platform dan bukan sebahagian daripada standard C.
Mengakses Bekas Pendasar
Satu penyelesaian adalah dengan tentukan templat tersuai yang menerima penyesuai bekas yang dikehendaki dan ekstrak bekas asas menggunakan pengkhususan templat. Sebagai contoh, pendekatan ini boleh digunakan untuk penyesuai tindanan dan baris gilir:
<code class="cpp">template<typename T> using Deque = std::deque<T>; template<typename T> using Stack = std::stack<T, Deque<T>>; template<typename T> std::ostream& operator<<(std::ostream& os, const Stack<T>& s) { // Output the contents of the underlying deque os << "["; for (const auto& elem : s.container()) { os << " " << elem; } os << " ]"; return os; }
Akses Gilir Keutamaan
Mengakses bekas asas baris gilir keutamaan adalah lebih mencabar kerana kepada pelaksanaan dalamannya. Walau bagaimanapun, penyelesaian yang bijak melibatkan penentuan subkelas bersarang dengan akses kepada ahli kontena persendirian:
<code class="cpp">template <typename T, typename S, typename C> struct PriorityHack : private priority_queue<T, S, C> { using priority_queue<T, S, C>::c; }; template <typename T, typename S, typename C> S& container(priority_queue<T, S, C>& pq) { return PriorityHack<T, S, C>::c(pq); }</code>
Ini membolehkan anda mendapatkan bekas asli baris gilir keutamaan menggunakan:
<code class="cpp">priority_queue<int> pq; vector<int>& tasks = container(pq); // Assign the underlying vector to tasks</code>
Penyelesaian ini menyediakan pendekatan piawai untuk mengakses bekas asas tindanan, baris gilir dan priority_queue penyesuai, tanpa mengira platform pelaksanaan.
Atas ialah kandungan terperinci Bolehkah Anda Mengakses Bekas Dasar Penyesuai Bekas STL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!