热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

unique_ptr是否交换复制内容?

我有一个带有多个成员变量的 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 xand yare unique_ptrs 那么它交换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);






推荐阅读
author-avatar
淑月冠廷婷婷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有