Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么STL使用赋值操作符在容器中移动项目?_C++_Stl - Fatal编程技术网

C++ 为什么STL使用赋值操作符在容器中移动项目?

C++ 为什么STL使用赋值操作符在容器中移动项目?,c++,stl,C++,Stl,例如,如果我们有一个10个元素的向量,并且我们决定删除第5个元素,那么第5个元素之后的所有元素都必须向后移动一个元素。为什么这里使用赋值运算符?既然我们知道旧拷贝即将被覆盖/失效,为什么不直接拷贝位呢 显然,这改变了我们的移动构造函数。我们假设这里不使用一个构造函数/赋值。 ,根本原因是C++对象可以保存涉及对象或其子对象< /p>地址的类不变量。 因此,如果要在不同的地址建立对象的值,则类可能需要执行代码以保留不变量。如果适用,该代码将进入移动/复制构造函数/赋值和交换函数 这种不变量的一个可

例如,如果我们有一个10个元素的向量,并且我们决定删除第5个元素,那么第5个元素之后的所有元素都必须向后移动一个元素。为什么这里使用赋值运算符?既然我们知道旧拷贝即将被覆盖/失效,为什么不直接拷贝位呢


显然,这改变了我们的移动构造函数。我们假设这里不使用一个构造函数/赋值。

,根本原因是C++对象可以保存涉及对象或其子对象< /p>地址的类不变量。 因此,如果要在不同的地址建立对象的值,则类可能需要执行代码以保留不变量。如果适用,该代码将进入移动/复制构造函数/赋值和交换函数

这种不变量的一个可能过于复杂的例子是,恰好有一个子对象注册到某个全局指针集合中,但哪个子对象在对象之间有所不同。如果您所做的只是复制位,那么就没有机会根据对象状态使用正确的子对象更新全局集合


在C++03中有一个严重的限制,即在您描述的情况下,对于某些类,只复制所有位是合适的,但是对于一般的复制赋值,只复制所有位是不合适的,并且在您的情况下,复制的成本是不必要的。这种限制是C++ 11移动语义地址,给类的行为不同的机会。

,根本原因是C++对象可以保存涉及对象或其子对象< /P>地址的类不变量。 因此,如果要在不同的地址建立对象的值,则类可能需要执行代码以保留不变量。如果适用,该代码将进入移动/复制构造函数/赋值和交换函数

这种不变量的一个可能过于复杂的例子是,恰好有一个子对象注册到某个全局指针集合中,但哪个子对象在对象之间有所不同。如果您所做的只是复制位,那么就没有机会根据对象状态使用正确的子对象更新全局集合


在C++03中有一个严重的限制,即在您描述的情况下,对于某些类,只复制所有位是合适的,但是对于一般的复制赋值,只复制所有位是不合适的,并且在您的情况下,复制的成本是不必要的。C++11移动语义解决了这个限制,使类有机会表现出不同的行为。

您能在这里展示使用赋值运算符的代码吗?你的问题现在还不是很清楚……因为如果简单地复制位总是合适的,那么就不需要赋值运算符重载。@hyde:它埋在每个实现的标准库中,但它要么在std::vector::erase中,要么从std::vector::erase中调用。@OliCharlesworth但在这种情况下,我们确实在移动数据,因为旧的副本将不再被引用。如果您在函数中使用了一些逻辑,或者使用了复制运算符或者赋值运算符,该怎么办?您希望调用它。您能在这里显示使用赋值运算符的代码吗?你的问题现在还不是很清楚……因为如果简单地复制位总是合适的,那么就不需要赋值运算符重载。@hyde:它埋在每个实现的标准库中,但它要么在std::vector::erase中,要么从std::vector::erase中调用。@OliCharlesworth但在这种情况下,我们确实在移动数据,因为旧的副本将不再被引用。如果您在函数中使用了一些逻辑,或者使用了复制运算符或者赋值运算符,该怎么办?你想叫它。