c++ - unique_ptr 是否交换复制内容?

标签 c++ swap unique-ptr

我有一个带有多个成员变量的 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 中的内容进行了繁琐的复制?

我问是因为我还可以重新设计这个东西,让堆元素只是索引。这些索引指的是存储实际内容的 vector 条目。然后,堆中的交换将只交换两个 size_t(而不是类 C 的大元素)并且事情会起作用。

提前谢谢你。

最佳答案

std::swap(x, y) 交换变量 xy 的内容。

如果 xyunique_ptr,那么它会交换 unique_ptr 变量的内容。 unique_ptr 变量包含一个指针,而不是整个对象。由于指针已交换,现在 y 指向 x 过去指向的地址,而 x 指向 y 的地址 用来指向。

换句话说,它与:

unique_ptr<whatever> temp = std::move(x);
x = std::move(y);
y = std::move(temp);

关于c++ - unique_ptr 是否交换复制内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66652076/

相关文章:

c - 异或交换输出预测

c++ - 返回智能指针

C++/pimpl : raw pointer or unique_ptr? 什么是更好的选择?

c++ - 是否可以重用通常的迭代器来构建 const 迭代器?

带有 throw(...) 的 C++ 方法声明

c++ - Boost.Python 找不到 pyconfig.h。它需要去哪里?

c++ - 唯一指针如何保证唯一性?

c# - Lambda 分配局部变量

c - C函数在char [] segfaults中交换两个char,尽管不使用字符串文字

c - 如何在结构中交换数组的结构元素 - C