std :: queue front会将前端元素排除在外吗?

时间:2010-11-09 12:56:29

标签: c++ queue std

std::queue::front将前线元素排除在外吗?如果不是如何删除它?

3 个答案:

答案 0 :(得分:9)

有一个获取元素的功能,另一个用于删除它:

typedef queue<MyClass> MyQueue;
MyQueue q;
q.push(MyClass(42));
// ...
MyClass const& rx = q.front();
rx.print();

MyClass x = q.front(); // Copies the front element to a fresh object
q.pop(); // From this point, rx is a dangling reference
assert(x == MyClass(42));

基本原理:如果只有一个pop函数返回前面的元素,则不可能获得对前面元素的引用,因为它已经从队列中删除了。如果您只是想在丢弃之前阅读一个巨大的元素,那么您肯定不希望您的代码执行副本。

编辑:另一个根本原因是拥有两个功能意味着用户负责制作副本。假设只有一个pop函数:如果复制构造函数(在pop内)抛出异常会发生什么? (参见@Steve Jessop的评论)

答案 1 :(得分:2)

不,它只返回对前元素的引用。如果您需要取出元素,请使用pop()。有关详细信息,请参阅std::queue参考。

答案 2 :(得分:2)

队列的前端操作的类型定义。

value_type& queue::front ()
const value_type& queue::front () const

两个表单都返回队列的下一个元素。调用者必须确保队列包含一个元素(size()&gt; 0);否则,行为未定义。非常量队列的第一种形式返回引用。因此,您可以在队列中修改下一个元素。由你来决定这是否是好风格。

使用pop删除它。它从队列中删除下一个元素。下一个元素是首先插入的元素(在队列中的所有其他元素之前)。此功能没有返回值。要处理下一个元素,必须先调用front()。