【发布时间】:2021-03-16 09:08:24
【问题描述】:
我有一个包含多个成员变量的 C 类,我正在编程一个二进制堆,其元素的类型为 std::unique_ptr。对于堆中元素的重新排序,我目前正在调用 std::swap(x,y) 其中 x 和 y 是对 unique_ptr 的引用。
我对 cplusplus.com 等网站上对这个函数的解释有点困惑。
https://www.cplusplus.com/reference/memory/unique_ptr/swap-free/
https://www.cplusplus.com/reference/memory/unique_ptr/swap/
我的问题是:每次调用 std::swap 时,这些 std::swap 规范是否会重新分配指针地址,或者它们是否确实对 x 和 y 中的内容进行了繁琐的复制?
我问是因为我也可以重新设计这个东西,让堆元素只是索引。这些索引指的是存储实际内容的向量条目。然后,堆中的交换将只交换两个 size_t(而不是 C 类的大元素)并且事情会起作用。
提前谢谢你。
【问题讨论】:
-
需要注意的一点:不是 cplusplus 的忠实粉丝。 cppreference 通常要好得多。
-
您有指向您的
unique_ptr的指针吗?如果它是基于索引的,你应该没问题。 -
我没有指向 unique_ptr 的指针。他们正在被交换,因为我需要在堆中保持一定的顺序。因此,例如,当我将一个元素添加到堆中时,它必须插入到堆中的正确位置。这是通过成对交换元素来完成的,直到新元素到达其正确位置。
-
如果这些指针是真正“独特的”,因为您不会将它们复制到所有地方,那么是的,
swap应该做您想做的事。它为您完成复制。它所做的只是交换两个任意事物的内容。 -
使用
std::swap()和两个std::unique_ptrs 调用std::unique_ptr::swap(),交换指针和关联的删除器(std::unique_ptr的另一个成员处理销毁托管对象)。它不会破坏和重建任何托管对象。
标签: c++ swap unique-ptr