为什么不支持容器适配器中元素的初始化和迭代
Why initialization and iteration of elements in container adapter are not supported
我正在尝试使用 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::stack
和std::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()
成员。
因为stack
和queue
不是聚合类型,并且它们不提供初始值设定项列表构造函数。
- 初始化迭代器错误 C++ 在 GCC 编译器中
- C++值初始化矢量迭代器比较
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 无法取消引用值初始化迭代器
- 制作可用于初始化向量的迭代器
- 为什么 2 个未初始化的 std::set::迭代器相等?
- 如何避免为模板化迭代器的每个可能的实例化专门化iterator_traits?
- 如何使用迭代器初始化地图的键字段?
- 从不同类型的容器的迭代器初始化向量
- 无法查找值初始化的向量迭代器?
- 为什么不支持容器适配器中元素的初始化和迭代
- HPX 是否提供具有粒度控制的基于任务的并行化迭代函数?
- 是否有一种方法可以使用Boost Serialization序列化迭代器
- 初始化迭代器的最佳方法是什么?
- 如何为自定义模板化迭代器实现 std::d istance()
- 传递给<N>回调函数的模板化迭代器
- 重载运算符==具有采用模板化迭代程序的自由函数
- C++11:模板化迭代器描述的基于范围的 for 循环
- 用c++用指针初始化迭代器
- 当泛化STL容器不知道迭代器的值类型时,如何使用模板化迭代器