访问STL容器适配器的底层容器
STL库提供了各种容器适配器,例如堆栈、队列和优先级队列。这些适配器提供了与底层容器交互的接口,但问题出现了:是否有标准化的方法来访问这个隐藏层?
缺乏标准访问方法
不幸的是,STL 没有定义标准方法来检索堆栈、队列或priority_queue 的本机容器。在某些实现(如 VS2008)中可用的 _Get_container() 函数是特定于平台的,而不是 C 标准的一部分。
访问底层容器
一种解决方法是定义接受所需容器适配器的自定义模板,并使用模板专门化提取底层容器。例如,此方法可用于堆栈和队列适配器:
<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; }
优先级队列访问
访问优先级队列的底层容器更具挑战性,因为到其内部实施。然而,一个聪明的解决方法是定义一个可以访问私有容器成员的嵌套子类:
<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>
这允许您使用以下方式获取优先级队列的本机容器:
<code class="cpp">priority_queue<int> pq; vector<int>& tasks = container(pq); // Assign the underlying vector to tasks</code>
该解决方案提供了一种标准化方法来访问堆栈、队列和priority_queue适配器的底层容器,无论实现平台如何。
以上是能否访问STL容器适配器底层容器?的详细内容。更多信息请关注PHP中文网其他相关文章!