为什么不支持容器适配器中元素的初始化和迭代

Why initialization and iteration of elements in container adapter are not supported

本文关键字:初始化 迭代 元素 不支持 适配器 为什么      更新时间:2023-10-16

我正在尝试使用 initializer_list<> 初始化堆栈/队列中的元素并使用迭代器迭代元素,但两者都不受支持。我知道它们是适配器并使用容器实现,但为什么我们不能执行这些操作? 通过 push() 将元素插入这些采用器中并可以使用 top()/pop()/front()/back() 方法打印/迭代元素的唯一方法?

#include <iostream>
#include <vector>
#include <queue> 
#include <stack>
#include <initializer_list>
using namespace std;
int main() 
{
//queue<int> q1{3,4,5,6}; // COMPILATION ERROR
//stack<int> s1{5,6,7,8};// COMPILATION ERROR
stack<int> s1;
s1.push(3);
s1.push(4);
s1.push(5);
s1.push(6);
//for(auto it: s1) //  COMPILATION ERROR
//  cout << it <<" ";
while(!s1.empty())
{
cout << s1.top() <<" ";
s1.pop();
}
} 

std::stackstd::queue容器适配器可能设计得尽可能通用。这些模板不"理解"如何存储和检索其元素。

堆栈需要back()push_back()pop_back()操作。队列需要front()back()push_back()pop_front()。因此,当您将元素推送到队列中时,它会在基础容器上调用push_back(),依此类推。

为了使堆栈和队列支持迭代,它们必须要求底层容器也支持迭代。因此,如果您发明了一个支持front()back()push_front()push_back()pop_front()pop_back()但不支持迭代的新容器,则无法使用该容器来构造堆栈或队列。因此,堆栈和队列适配器将尽可能通用。

我希望这个答案能帮助你。

stack<T>queue<T>是两种非常特殊的数据结构,它们遵循FILO(先进后出)和FIFO(先进先出),它们环绕给定的容器类(默认为deque<T>)。堆栈和队列都是计算机科学中的抽象数据类型,支持一组非常纤薄的操作,即在末尾(pop)或开头(取消队列)添加元素(推送/排队)和删除元素。C++的版本旨在实现这些概念。它们不是要用作容器(如deque<T>)的常规替代品,因此没有initializer_list构造函数(元素应按顺序一个接一个地添加),也没有迭代所需的begin()end()成员。

因为stackqueue不是聚合类型,并且它们不提供初始值设定项列表构造函数。