gpt4 book ai didi

c++ - 分配空 std::vector 是否与交换空 std::vector 相同?

转载 作者:行者123 更新时间:2023-12-05 05:50:46 26 4
gpt4 key购买 nike

C++ delete vector, objects, free memory声明为了在清除 std::vector 后释放分配的堆内存,可以这样做:

vector<int>().swap(myVector);

这是有道理的,但我想知道以下是否不会达到同样的效果。谁能告诉我是否有区别?

myVector = vector<int>();

最佳答案

根据标准,从右值赋值(即:移动赋值)给(非 std::array )容器 is not allowed to invoke the move constructor or assignment operators of T unless the allocator for that container does not propagate on container move-assignment .这意味着 vector 的唯一有效实现此类分配器的 s 是破坏当前分配并采用右值中的分配。 std::allocator确实在容器移动分配上传播,因此此类容器的任何移动分配都将强制采用右值的内容。

这是否意味着 myVector = vector<int>();保证采用空分配?不必要。实现检测右值容器为空,销毁它自己的元素,但保留其内部分配供以后使用是完全有效的。

相比之下,vector::swap 的实现是不可行的做同样的事情。迭代器/指针/引用保存要求确保一个容器中对象的迭代器/指针/引用映射到另一个容器中的对象(只要分配器通过容器交换传播允许这样做)。这意味着两个对象中的分配实际上必须交换,即使其中一个没有分配。赋值没有这样的迭代器保存要求。

话虽这么说,假设实现将是病态的并积极尝试避免您尝试删除容器的分配并不是一个好主意。同样,调用 shrink_to_fit不能保证容量会改变...但是没有的实现将是一个非常愚蠢的实现。

因此,有人可能会争辩说,最好的代码应该是能够清楚地解释正在发生的事情的代码。 swap是一个成语,你必须让某人解释你为什么在这样的纯右值上使用它。 clear()其次是 shrink_to_fit仅从文档中就可以清楚地说明您在做什么;无需解释。

所以也许可以考虑这样做。

关于c++ - 分配空 std::vector 是否与交换空 std::vector 相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70466219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com