使用2方法提取容器中的数据(pop_front和前面)
using 2 method to extract data in container ( pop_front and front )
( 对不起,我的英语不好!嗨,我正在学习工业计算。这是我的第五个任期。在我的一门课程中,老师要求我们用 c 写一个类"列表"(仅转发,下一个元素的 ptr 而不是前一个元素)。我做了一个简单的"提取"方法,该方法返回一个value_type并删除第一个元素,但我的老师说,如果复制构造函数抛出异常,该值将丢失,因为它已被提取。我看过 std::forward_list,我看到 stl 提供了一种提取方法和一种访问最后一个元素(pop_front() 和 front() )的方法。我不明白为什么我们不能用一种方法来做到这一点?我写了这段代码:
value_type extract()
{
if( empty() )
throw EmptyList();
std::unique_ptr< Node > p = m_Head;
if( m_Head == m_Last )
m_Last = nullptr;
m_Head = m_Head->m_Next;
try
{
return p->m_Value;
}
catch( ... )
{
m_Head = p.release();
if( !m_Last )
m_Last = m_Head;
throw;
}
}
我还制作了一个带有 nothrow_t 参数的方法提取,该参数不会复制任何内容(返回 void),因此我们可以"强制"提取。为什么 stl 不这样做?最好做"auto v = something.pop();"!我的版本安全吗?如果我们真的关心可以在复制构造函数中抛出的异常,并且我们真的想继续并保留数据,那么我们不能简单地尝试捕获"pop"方法吗?
谢谢你的帮助!
我不明白为什么我们不能用一种方法来做到这一点?
需要这两个操作来提供强大的异常保证 - 也就是说,如果随时引发异常,则不应更改容器。
auto v = something.pop()
,您的提案必须按顺序做三件事:
- 从容器中删除元素;
- 从函数返回该元素;
- 使用返回值初始化
v
。
如果最后阶段引发异常,则该元素将从容器中删除并丢失。尝试使用 try...catch
构造修复此问题无济于事:从函数返回后将引发异常,因此不会被函数中的处理程序捕获。
使用 STL 风格的界面分两个阶段完成,顺序是:
- 处理对容器元素的引用;
- 从容器中删除元素。
现在,如果处理引发异常,该元素将保留在容器中并且不会丢失。
如今,通过将移动语义添加到语言中,您可以实现您的版本,并要求元素在移动时不会抛出。这是一个相当合理的要求,已经在 C++11 容器上进行了一些操作。但这并没有发生,我怀疑这样的改变只是为了一点方便。
如果我们真的关心可以在复制构造函数中抛出的异常,并且我们真的想继续并保留数据,那么我们不能简单地尝试捕获"pop"方法吗?
我们可以;但这比提供异常安全界面更不方便,而且更容易出错。
STL 使它成为两个操作,因为 front() 函数返回一个引用,而不是一个值,以消除双重副本。在返回项目时从列表中删除项目需要按值返回,否则对象将超出范围。
- muQueue.front() 给出了 const 实例,即使我没有将其标记为 const
- 在c++队列中使用pop和visit实现线程安全
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- C++ queue.front();为什么不从第一个元素开始呢?
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- C++ 带模板的链表 - 如何创建 pop()?
- std::stack的奇怪行为,pop()返回相同的值
- 为什么以下 POP 功能无法在主机或设备 (CUDA) 上运行?
- C++ 中类成员的堆栈的 pop() 函数
- 没有相应 POP 的编译指示包(推送)会导致堆栈粉碎
- Boost::msm 如何使用非默认构造函数初始化state_machine_def和 msm::front::sta
- 递归推动POP POSTFIX计算器无法正确执行操作,只需将最后一个数字作为结果
- 关于反序列化程序 pop 函数的模板化专用化的歧义
- 列表大小为 1,但 front() 和 back() 不相等
- E0020 标识符"pop"未定义
- 无效地将 void 表达式与队列和 .pop() 一起使用
- 如何存储队列返回的值::front?
- 当您通过Qt小部件打开文件时,是否可以'pop-up'文件?
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用