有没有办法在删除它的同时从 std::list 中提取一个元素(不分别调用两个 front 和 pop_front 方法)?如果没有这种方法或可能性,那么委员会不将这种方法添加到标准中的动机是什么?
// Например сделать так.
auto val = list.take_front();
// Заместо
auto val = list.front();
list.pop_front();
有没有办法在删除它的同时从 std::list 中提取一个元素(不分别调用两个 front 和 pop_front 方法)?如果没有这种方法或可能性,那么委员会不将这种方法添加到标准中的动机是什么?
// Например сделать так.
auto val = list.take_front();
// Заместо
auto val = list.front();
list.pop_front();
正如您在此类的描述中看到的那样,没有这样的方法。尽管在许多编程语言中
pop只是删除并立即返回值(例如,在 JavaScript'e 中)。这样做是为了防止内存问题。如果列表不是数字,而是自定义类的对象怎么办?返回一个链接?它已经可以通过调用析构函数来删除。限制一个类定义一个复制构造函数?也不是一个选择。对于类的最终用户(即开发人员,您)来说,针对他的特定情况签署一行解决方案要容易得多。
几年前在 enSO 上有一个关于std::queue的类似问题,您可以在其中找到更多解释。
事实上,所有标准容器都旨在为存储在其中的对象提供存储空间。支持从容器中提取任何元素的能力需要实现对拆分和异化容器内部存储的支持,这不是一件小事。
例如,可以轻松地支持复制或移动现有元素
但是,正如您所看到的,这里不会有很大的节省。
添加和获取项目的能力是在侵入式容器中实现的,这些容器的设计目的不是为存储在其中的对象提供存储,而是将其委托给用户。此示例仅创建对象的一个实例,该对象
t_Item被添加到容器中然后从容器中删除,而不创建其他实例: