std::queue::front
将前线元素排除在外吗?如果不是如何删除它?
答案 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()。