为什么STL使用赋值操作符在容器中移动项?
Why does the STL use the assignment operator to move items around in containers?
例如,如果我们有一个10个元素的向量,我们决定删除第5个元素,那么第5个元素之后的所有元素都必须向后移动一个元素。为什么这里使用赋值操作符?既然我们知道旧的副本即将被覆盖/失效,为什么不直接复制这些位呢?
显然,这改变了move构造函数。我们假设这里没有使用move构造函数/赋值。
根本原因是c++对象可以保留涉及对象(或其子对象)地址的类不变量
因此,如果要在不同的地址建立对象的值,则类可能需要执行代码来保持不变性。这些代码放在move/copy构造函数/赋值函数和swap函数中(如果适用)。
这种不变量的一个(可能过于复杂的)例子是,"只有一个子对象注册到某个指针的全局集合中,但其中一个在对象之间是不同的"。如果您所做的只是复制位,那么就没有机会根据对象状态用"正确的"子对象更新全局集合。
在c++ 03中有一个严重的限制,有些类在你所描述的情况下可以复制所有的位,但在一般情况下,为了复制赋值而复制所有的位是不合适的,在你的情况下,复制是不必要的昂贵的。这个限制是c++ 11移动语义地址,给类机会以不同的行为。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 将对象移动到std::shared_ptr
- 在 stl 算法中移动迭代器
- 是否有任何常规方法可以通知 STL 移动和复制构造函数?
- MSVC 2017中STL容器的移动构造函数未标记为NOExcept
- C 11 STL容器支持仅移动类型,并且具有O(1)写入访问的开始和结束
- STL 向量:移动向量的所有元素
- 在从 stl 向量的派生类中实现移动语义
- STL容器移动选定的元素
- 有没有一种方法可以将无符号字符块移动到 STL 向量中,而不是一次移动 1 个无符号字符
- 如何将 std::unique_ptr<> 从一个 STL 容器移动到另一个容器?
- 在进程之间移动STL对象
- 从STL容器中移动元素是否会将其从该容器中移除
- Std::将Std::unique_ptr对象移动到STL容器中.(MSVC编译器问题)
- 如何从STL容器中获得仅限移动类型
- STL容器和不可复制(和不可移动)的对象
- 移动设备上的STL和TR1
- 为什么STL使用赋值操作符在容器中移动项?
- 作用于可移动但不可复制对象序列的变化STL算法的行为