什么是 STL 队列的 C++ 迭代器?

问题描述

我知道我们不能在 STL 队列中轻松迭代,但我想做这样的事情:

void myFun(Node* root) {
    queue<pair<int,Node*>> myQueue;
    myQueue.push(make_pair(0,root));
    auto it = myQueue.front();
}

这有效,但是,我应该使用什么来代替队列的 auto 关键字?

我们对地图使用这样的东西:

map<int,Node*>::iterator it = myMap.begin();

但是

queue<pair<int,Node*>>::iterator it = myQueue.front(); 

这不起作用并引发错误

‘iterator’ is not a member of ‘std::queue<std::pair<int,Node*> >’
queue<pair<int,Node*>>::iterator it = myQueue.front(); 

正确的语法是什么?

解决方法

std::queuefront 成员根本不返回迭代器,它返回对队列中第一个元素的引用。所以 auto 只是队列中的类型

std::pair<int,Node*> it = myQueue.front();

这会生成元素的副本,但您也可以引用该元素或常量引用。

由于没有返回迭代器的 queue 成员函数,您必须查看具有 frontpop 调用序列的所有元素。

,

您应该使用 pair<int,Node*> &,(可能是 const),因为这就是 front() 返回的内容。没有一个容器(或容器适配器)具有返回迭代器的 front() 方法。

你想完成什么?

,

std::queue 不提供对其内部的访问。它的接口是一个队列:你将元素推入其中,然后从其中弹出元素。就这样。如果您需要一个容器来查看其内容,`std::queued 不是合适的选择。