首页  >  文章  >  后端开发  >  能否访问STL容器适配器底层容器?

能否访问STL容器适配器底层容器?

Barbara Streisand
Barbara Streisand原创
2024-11-02 17:47:02306浏览

Can You Access the Underlying Containers of STL Container Adaptors?

访问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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn