作者:淑月冠廷婷婷 | 来源:互联网 | 2023-06-04 17:06
我有一个带有多个成员变量的 C 类,我正在编写一个二元堆,其元素的类型为 std::unique_ptr。对于堆中元素的重新排序,我目前正在调用 std::swap(x,y),其中 x 和 y 是对
我有一个带有多个成员变量的 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 的大元素),并且事情会起作用。
先感谢您。
回答
std::swap(x, y)
交换变量x
和的内容y
。
If x
and y
are unique_ptr
s 那么它交换unique_ptr
变量的内容。甲unique_ptr
变量保存一个指针,而不是将整个对象。由于指针被交换,现在指向以前y
指向的地址x
和以前指向x
的地址y
。
换句话说,它与以下内容相同:
unique_ptr temp = std::move(x);
x = std::move(y);
y = std::move(temp);
回答
std::swap 的这些规范是否重新分配指针地址
是的。
还是每次我调用 std::swap 时,他们确实对 x 和 y 中的内容进行了乏味的复制?
不。
如果你确实想执行这样的交换,你可以通过指针间接:
std::swap(*x, *y);