首页 >后端开发 >C++ >如何访问STL容器适配器的底层容器?

如何访问STL容器适配器的底层容器?

Susan Sarandon
Susan Sarandon原创
2024-11-03 12:42:02931浏览

How Can I Access the Underlying Container of an STL Container Adaptor?

访问 STL 容器适配器的底层容器

C 标准模板库 (STL) 中的容器适配器,例如堆栈、队列和priority_queue,在双端队列或向量等底层容器之上提供方便的接口。然而,根据定制操作的需要获取对底层容器的引用可能具有挑战性。

有标准方法吗?

没有,没有标准方法从这些适配器直接访问底层容器。提到的 _Get_container() 方法不是 C 标准的一部分,可能会因实现而异。

常见解决方法

一种常见的解决方法是使用模板专门化,如下所示如下:

<code class="cpp">template <class Type>
struct ContainerAdapter {
  static Type& container(const Type& adapter) {
    return adapter; // Assumes underlying container is of the same type
  }
};</code>

通过针对每个特定适配器类型专门化此模板,我们可以访问底层容器。例如:

<code class="cpp">template <>
struct ContainerAdapter<std::stack<int>> {
  static std::deque<int>& container(const std::stack<int>& stack) {
    return stack.*&stack::_deque; // Internal implementation hack
  }
};</code>

priority_queue 的自定义实现

对于priority_queue,可以使用结构模板实现类似的方法:

<code class="cpp">template <class T, class S, class C>
struct PriorityQueueAdapter {
  static S& container(priority_queue<T, S, C>& pq) {
    // Use a type trick to access private member
    struct Inner : private priority_queue<T, S, C> {
      static S& container(priority_queue<T, S, C>& pq) {
        return pq.*&Inner::c;
      }
    };
    return Inner::container(pq);
  }
};</code>

官方文档

C 标准库的官方文档可以在 ISO/IEC 网站上找到:https://www.iso.org/standard/74983.html

以上是如何访问STL容器适配器的底层容器?的详细内容。更多信息请关注PHP中文网其他相关文章!

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