草庐IT

non-unique

全部标签

c++ - 对 unique_ptrs 集的原始指针查找

我经常发现自己想写这样的代码:classMyClass{public:voidaddObject(std::unique_ptr&&newObject);voidremoveObject(constObject*target);private:std::set>objects;};然而,std::set接口(interface)的大部分内容对于std::unique_ptrs来说是无用的,因为查找函数需要std::unique_ptr参数(我显然没有,因为它们归集合本身所有).我可以想到两个主要的解决方案。创建一个临时的unique_ptr用于查找。例如,上面的removeObject

c++ - 为什么 unique_ptr 实例化编译为比原始指针更大的二进制文件?

我一直认为std::unique_ptr与使用原始指针相比没有开销。但是,编译如下代码#includevoidraw_pointer(){int*p=newint[100];delete[]p;}voidsmart_pointer(){autop=std::make_unique(100);}使用g++-std=c++14-O3生成以下程序集:raw_pointer():subrsp,8movedi,400calloperatornew[](unsignedlong)addrsp,8movrdi,raxjmpoperatordelete[](void*)smart_pointer():

c++ - 为什么 unique_ptr 实例化编译为比原始指针更大的二进制文件?

我一直认为std::unique_ptr与使用原始指针相比没有开销。但是,编译如下代码#includevoidraw_pointer(){int*p=newint[100];delete[]p;}voidsmart_pointer(){autop=std::make_unique(100);}使用g++-std=c++14-O3生成以下程序集:raw_pointer():subrsp,8movedi,400calloperatornew[](unsignedlong)addrsp,8movrdi,raxjmpoperatordelete[](void*)smart_pointer():

C++ STL map::erase a non-existing key

关于C++STL映射,按键删除:-size_typemap::erase(constkey_type&x);删除不存在的key是否合法?即下面的片段可以吗?mapmymap;mymap['c']=30;mymap.erase('c');mymap.erase('c');mymap.erase('D');干杯 最佳答案 是的,事实上,std::map::erase()返回一个size_type,它指示已删除的键数。因此,它返回0表示没有删除任何内容,而返回1表示map已删除的内容。 关于C

C++ STL map::erase a non-existing key

关于C++STL映射,按键删除:-size_typemap::erase(constkey_type&x);删除不存在的key是否合法?即下面的片段可以吗?mapmymap;mymap['c']=30;mymap.erase('c');mymap.erase('c');mymap.erase('D');干杯 最佳答案 是的,事实上,std::map::erase()返回一个size_type,它指示已删除的键数。因此,它返回0表示没有删除任何内容,而返回1表示map已删除的内容。 关于C

c++ - 那么在 STL 集合中可以安全地使用 unique_ptr 吗?

我对unique_ptr和右值移动哲学感到困惑。假设我们有两个集合:std::vector>autoCollection;std::vector>uniqueCollection;现在我预计以下操作会失败,因为不知道算法在内部做什么,并且可能会制作内部数据透视拷贝等,从而剥夺auto_ptr的所有权:std::sort(autoCollection.begin(),autoCollection.end());我明白了。并且编译器正确地不允许这种情况发生。然后我这样做:std::sort(uniqueCollection.begin(),uniqueCollection.end());然

c++ - 那么在 STL 集合中可以安全地使用 unique_ptr 吗?

我对unique_ptr和右值移动哲学感到困惑。假设我们有两个集合:std::vector>autoCollection;std::vector>uniqueCollection;现在我预计以下操作会失败,因为不知道算法在内部做什么,并且可能会制作内部数据透视拷贝等,从而剥夺auto_ptr的所有权:std::sort(autoCollection.begin(),autoCollection.end());我明白了。并且编译器正确地不允许这种情况发生。然后我这样做:std::sort(uniqueCollection.begin(),uniqueCollection.end());然

c++ - 从队列中删除 unique_ptr

我正在尝试弄清楚如何/是否可以在queue中使用unique_ptr。//createqueuestd::queue>q;//addelementstd::unique_ptrp(newint{123});q.push(std::move(p));//trytograbtheelementautop2=foo_queue.front();q.pop();我明白为什么上面的代码不起作用。由于front和pop是2个独立的步骤,因此无法移动元素。有没有办法做到这一点? 最佳答案 你应该明确地说你想要移动指针离开队列。像这样:std::u

c++ - 从队列中删除 unique_ptr

我正在尝试弄清楚如何/是否可以在queue中使用unique_ptr。//createqueuestd::queue>q;//addelementstd::unique_ptrp(newint{123});q.push(std::move(p));//trytograbtheelementautop2=foo_queue.front();q.pop();我明白为什么上面的代码不起作用。由于front和pop是2个独立的步骤,因此无法移动元素。有没有办法做到这一点? 最佳答案 你应该明确地说你想要移动指针离开队列。像这样:std::u

c++ - 如何将 unique_ptr 用于 pimpl?

这是我尝试将unique_ptr用于pimpl时所看到的简化。我选择unique_ptr是因为我真的希望类拥有指针-我希望pimpl指针和类的生命周期相同。不管怎样,这是标题:#ifndefHELP#defineHELP1#includeclassHelp{public:Help(intii);~Help()=default;private:classImpl;std::unique_ptr_M_impl;};#endif//HELP这里是来源:#include"Help.h"classHelp::Impl{public:Impl(intii):_M_i{ii}{}private:in