首页 >后端开发 >C++ >C 中移出向量总是空的吗?

C 中移出向量总是空的吗?

Susan Sarandon
Susan Sarandon原创
2024-11-17 17:34:02612浏览

Are Moved-From Vectors Always Empty in C  ?

移出向量的空性:探索选项

在 C 编程领域,向量是通用的数据结构,通常用于其高效的内存管理。然而,在理解移出向量的行为时,程序员可能会遇到关于其空性的问题。

标准定义和要求

C 标准提供了通用的对象被移走后的行为准则,如 N3485 17.6.5.15 中所述[lib.types.movedfrom]/1:

“C 标准库中定义的类型的对象可以从 (12.8) 移动。移动操作可以显式指定或隐式生成。除非另有指定,否则此类移动-from 对象应置于有效但未指定的状态。”

虽然此规定没有明确排除向量,但也没有提供关于向量的具体指导

检查移动构造函数

向量的移动构造函数,vector::vector(vector&& v),需要具有恒定的复杂性。这需要将资源从源向量 v 转移到新向量 *this,使 v 处于空状态。

探索移动分配和分配器影响

The移动赋值运算符、向量& vector::operator=(vector&& v),表现出更多的复杂性并且受到向量分配器的影响。出现三种情况:

  1. 启用分配器传播:
    当 allocator_traits::propagate_on_container_move_assignment::value 为 true 时,移动赋值运算符释放元素和内存,传输v 的所有权,并留下两个向量空。
  2. 禁用分配器传播(相同分配器):
    与前一种情况类似,移动赋值运算符类似于情况 1,但完整保留了分配器。然而,它遵循相同的模式,导致空向量。
  3. 禁用分配器传播(不同的分配器):
    在这种情况下,移动分配无法传输资源并诉诸于移动单独的元素。这需要能够移动分配或复制分配元素,可能使移出向量 v 包含移出元素。某些实现可能会选择显式清除 v,但这不是标准强制要求的。

结论

虽然向量在移动后通常会变空,但也有例外,具体取决于分配器的行为以及移动或复制分配元素的能力。实现可以自由地采用不同的方法,只要它们遵守移出对象的一般要求即可。在 C 应用程序中使用向量和移动语义时,理解这些场景对于程序员至关重要。

以上是C 中移出向量总是空的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn