- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个 C++ 程序,它使用包含类实例的 std::list。如果我调用例如myList.push_back(MyClass(variable));
它会先创建一个临时变量,然后立即将其复制到 vector 中,然后删除该临时变量。这几乎没有我想要的效率,而且当你需要一个深拷贝时很糟糕。
我希望我的类 new
的构造函数有一些东西,而不必为了第二次分配我的内存并浪费运行时而实现一个复制构造函数。我也不想立即从 vector/列表中找到类实例,然后手动分配内存(或者做一些可怕的事情,比如在复制构造函数本身中分配内存)。
有没有办法解决这个问题(我没有使用 Visual Studio BTW)?
最佳答案
C++0x 移动构造函数是一种部分解决方法:不是调用复制构造函数,而是调用移动构造函数。移动构造函数类似于复制构造函数,只是它允许使源参数无效。
C++0x 添加了另一个 功能,可以完全满足您的需求:emplace_back
。 (N3092 §23.2.3)您将参数传递给构造函数,然后它使用这些参数调用构造函数 (通过 ...
和转发),因此没有其他构造函数可以随时调用。
对于 C++03,您唯一的选择是为您的类添加一个未初始化的状态。在 push_back
之后立即调用的另一个函数中执行实际构造。 boost::optional
可能会帮助您避免初始化类的成员,但它反过来要求 它们 是可复制构造的。或者,正如 Fred 所说,使用最初为空的智能指针完成同样的事情。
关于c++ - 如何在不调用复制构造函数的情况下使用类初始化 STL vector/列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2580189/
我是一名优秀的程序员,十分优秀!