提问人:Parvinder Singh 提问时间:9/26/2012 最后编辑:GriwesParvinder Singh 更新时间:12/25/2021 访问量:42556
pop_back() 返回值?
pop_back() return value?
答:
那么,必须有多少个原因呢?
这样可以避免在只想从容器中删除对象时对对象进行可能代价高昂的复制。C++的理念是不为不需要的东西付费。
评论
It just pops, and if we want to know what was on the top of the stack before pop, we must look. This happens not to be my favorite style of stack, but it's arguably more efficient and it's the standard
为什么它会返回该值?在弹出该值之前,您始终可以随时访问该值 - 无需提供此功能。pop_back
评论
pop_back
pop_back()
我认为复制最后一个对象的实例可能会引发异常这一事实有关。这样做时,您将丢失对象,因为 pop_back() 确实将其从容器中删除。最好用几行代码:
std::vector<AnyClass> holds = {...} ;
try {
const AnyClass result = holds.pop_back(); // The copy Ctor throw here!
} catch (...)
{
// Last value lost here.
}
评论
pop_back
noexcept
这是因为命令-查询分离原则。
效率是一回事。不返回元素的另一个原因是异常安全。
如果函数返回了该值,并且复制构造函数引发了异常,则可能无法保证容器处于与调用之前相同的状态。pop_back()
pop()
pop()
您可以在 Herb Sutters 书籍中找到有关异常的更多信息。我认为这里涵盖了这个话题。但我不确定。
评论
效率与它几乎没有关系(或者说根本没有关系)。
这个设计是汤姆·嘉吉(Tom Cargill)在90年代发表的一篇重要论文的成果,该论文在当时引起了不少人的注意。IIRC在嘉吉公司中表明,不可能设计出一个异常安全堆栈弹出功能。
评论
NULL
原因与其说是效率,不如说是异常安全。容器类可用于存储任何类型的对象。如果函数在从容器中删除对象后返回对象,则不可能以异常安全的方式实现 pop_back(),因为返回对象的值涉及复制构造。
这是 vector::p op_back() 在 GNU C++ 标准库中的实际实现:
void
pop_back()
{
--this->_M_impl._M_finish;
this->_M_impl.destroy(this->_M_impl._M_finish);
}
如果它最终返回最后一个元素,它会是什么样子:
value_type
pop_back()
{
value_type save = back();
--this->_M_impl._M_finish;
this->_M_impl.destroy(this->_M_impl._M_finish);
return save;
}
这涉及两个复制构造,分别在语句和返回对象副本时。不能保证在从容器中销毁元素后,返回表达式不会引发异常。save = back()
在计算机编程中,正交性意味着操作发生变化 只做一件事,不影响他人。
pop_back()
只做一件事,它不复制,因此它是正交的。
评论