Bolehkah Anda Mengakses Bekas Dasar Penyesuai Bekas STL?

Barbara Streisand
Lepaskan: 2024-11-02 17:47:02
asal
319 orang telah melayarinya

Can You Access the Underlying Containers of STL Container Adaptors?

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;
}
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan