Access Underlying Containers of STL Container Adaptors
The STL library provides various container adaptors, such as stacks, queues, and priority queues. These adaptors offer an interface for interacting with underlying containers, but the question arises: is there a standardized way to access this hidden layer?
Lack of Standard Access Method
Unfortunately, the STL does not define a standard method to retrieve the native container of stack, queue, or priority_queue. The _Get_container() function available in certain implementations, like VS2008, is platform-specific and not part of the C standard.
Accessing Underlying Containers
One workaround is to define custom templates that accept the desired container adaptor and extract the underlying container using template specialization. For example, this approach can be used for stack and queue adaptors:
<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; }
Priority Queue Access
Accessing the underlying container of a priority queue is more challenging due to its internal implementation. However, a clever workaround involves defining a nested subclass with access to the private container member:
<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>
This allows you to obtain the native container of a priority queue using:
<code class="cpp">priority_queue<int> pq; vector<int>& tasks = container(pq); // Assign the underlying vector to tasks</code>
This solution provides a standardized approach to accessing the underlying containers of stack, queue, and priority_queue adaptors, regardless of the implementation platform.
The above is the detailed content of Can You Access the Underlying Containers of STL Container Adaptors?. For more information, please follow other related articles on the PHP Chinese website!