如何使用类初始化 STL 向量/列表而不调用复制构造函数

2024-04-20

我有一个 C++ 程序,它使用包含类实例的 std::list 。如果我打电话,例如myList.push_back(MyClass(variable));它经历创建临时变量的过程,然后立即将其复制到向量,然后删除临时变量。这远没有我想要的那么高效,而且当您需要深层复制时,这很糟糕。

我希望有我的类的构造函数new一些东西,而不必实现复制构造函数只是为了第二次分配我的内存并浪费运行时间。我也不想立即从向量/列表中找到类实例,然后手动分配内存(或者做一些可怕的事情,比如在复制构造函数本身中分配内存)。

有什么办法可以解决这个问题吗(顺便说一句,我没有使用 Visual Studio)?


C++0x 移动构造函数是部分解决方法:不是调用复制构造函数,而是调用移动构造函数。移动构造函数类似于复制构造函数,只不过它允许使源参数无效。

C++0x 添加another功能将完全满足您的需求:emplace_back。 (N3092 §23.2.3) 将参数传递给构造函数,然后它调用构造函数与这些论点 (by ...和转发),因此无法调用其他构造函数。

对于 C++03,您唯一的选择是向您的类添加未初始化状态。在紧随其后调用的另一个函数中执行实际构造push_back. boost::optional可能会帮助您避免初始化类的成员,但它反过来又需要they可复制构造。或者,正如 Fred 所说,使用最初为空的智能指针来完成同样的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用类初始化 STL 向量/列表而不调用复制构造函数 的相关文章