c++ - 对 unique_ptrs 列表进行排序
问题描述
以下代码将无法编译:
bool ptrLess(unique_ptr<int> ptr1, unique_ptr<int> ptr2)
{
return *ptr1 < *ptr2;
}
int main()
{
unique_ptr<int> ptr1(new int(3));
unique_ptr<int> ptr2(new int(2));
unique_ptr<int> ptr3(new int(5));
list<unique_ptr<int>> list;
list.push_back(ptr1);
list.push_back(ptr2);
list.push_back(ptr3);
list.sort(ptrLess);
for (auto &element : list) {
cout << *element;
}
return 0;
}
我认为这是因为unique_ptr
' 的复制构造函数被删除了。我收到如下错误:
错误 C2280:'std::unique_ptr>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)':试图引用已删除的函数
有没有办法对unique_ptr
's 的列表进行排序,也许是通过使用移动构造函数来代替?
解决方案
您应该使用 const ref - 毕竟您不想修改这些指针:
bool ptrLess(const unique_ptr<int>& ptr1, const unique_ptr<int>& ptr2)
如果您的list
模板是std::list
,则将参数作为 r 值引用传递将不起作用 -list::sort
必须调用std::move
有效地重置您的指针。
编辑
至于列出您的其余代码:std::list
有一个方便的方法,称为emplace_back
(and emplace_front
),它允许您就地构造和附加元素:
your_list.emplace_back(new int(2));
推荐阅读
- javascript - 为什么 IE 11 会自动更改变量的值?
- java - 休息服务号码验证
- java - Selenium 与 TorBrowser
- maven - maven 找不到工件 org.cytoscape:
- angular - Angular 5:错误类型错误:_this.pageProjects.indexOf 不是函数
- javascript - 何时使用 HOC。何时使用函数作为子级
- java - TOmcat 启动时出错:java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
- c - 您能在 ZeroMQ 中获取发布者和订阅者的身份/地址吗?
- c# - 附加到代码中的内容时,单元格重复图像
- amazon-web-services - Terraform 自定义属性破坏用户池 AWS