草庐IT

m_swapped

全部标签

c++ - 既然我们已经有了 move 语义,那么专门化 std::swap 了吗?

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:Movesemantics==customswapfunctionobsolete?这就是std::swap在C++11中的样子:templatevoidswap(T&x,T&y){Tz=std::move(x);x=std::move(y);y=std::move(z);}我是否仍然需要为我自己的类型专门化std::swap,或者std::swap是否尽可能高效,前提是我的类定义当然是move构造函数和move赋值运算符? 最佳答案 std::swap的特

c++ - std::swap vs std::exchange vs 交换运算符

std::swap的实现可能如下所示:templatevoidswap(T&a,T&b){Tc(std::move(a));a=std::move(b);b=std::move(c);}templatevoidswap(T(&a)[N],T(&b)[N]){for(size_ti=0;i一个实现std::exchangen3668可能看起来像这样:templateTexchange(T&obj,U&&new_val){Told_val=std::move(obj);obj=std::forward(new_val);returnold_val;}上面写着:Forprimitivetyp

c++ - 如何重载 std::swap()

std::swap()被许多std容器(例如std::list和std::vector)在排序甚至分配。但是swap()的std实现非常通用,对于自定义类型效率相当低。因此,可以通过使用自定义类型特定实现重载std::swap()来获得效率。但是如何实现它以供std容器使用呢? 最佳答案 重载std::swap的实现(也就是专门化它)的正确方法是将它写在与你正在交换的相同的命名空间中,以便可以通过以下方式找到它argument-dependentlookup(ADL).一件特别容易做的事情是:classX{//...friendvo

c++ - move 分配与标准 copy-and-swap 不兼容

测试新的move语义。我刚刚询问了我在使用MoveConstructor时遇到的问题。但正如评论中发现的那样,问题实际上是当您使用标准的“copy-and-swap”习语时,“move赋值”运算符和“标准赋值”运算符会发生冲突。这是我正在使用的类(class):#include#includeclassString{intlen;char*data;public://Defaultconstructor//InTermsofC-StringconstructorString():String(""){}//NormalconstructorthattakesaC-StringStrin

c++ - move 分配与标准 copy-and-swap 不兼容

测试新的move语义。我刚刚询问了我在使用MoveConstructor时遇到的问题。但正如评论中发现的那样,问题实际上是当您使用标准的“copy-and-swap”习语时,“move赋值”运算符和“标准赋值”运算符会发生冲突。这是我正在使用的类(class):#include#includeclassString{intlen;char*data;public://Defaultconstructor//InTermsofC-StringconstructorString():String(""){}//NormalconstructorthattakesaC-StringStrin

c++ - iter_swap() 与 swap() - 有什么区别?

MSDNsays:swapshouldbeusedinpreferencetoiter_swap,whichwasincludedintheC++Standardforbackwardcompatibility.但是comp.std.c++says:MostSTLalgorithmsoperateoniteratorranges.Itthereforemakessensetouseiter_swapwhenswappingelementswithinthoseranges,sincethatisitsintendedpurpose---swappingtheelementspointe

c++ - iter_swap() 与 swap() - 有什么区别?

MSDNsays:swapshouldbeusedinpreferencetoiter_swap,whichwasincludedintheC++Standardforbackwardcompatibility.但是comp.std.c++says:MostSTLalgorithmsoperateoniteratorranges.Itthereforemakessensetouseiter_swapwhenswappingelementswithinthoseranges,sincethatisitsintendedpurpose---swappingtheelementspointe

c++ - std::vector::swap 是否使迭代器无效?

如果我交换两个vector,它们的迭代器会保持有效,现在只是指向“其他”容器,还是迭代器会失效?也就是说,给定:usingnamespacestd;vectorx(42,42);vectory;vector::iteratora=x.begin();vector::iteratorb=x.end();x.swap(y);//aandbstillvalid?Pointingtoxory?std似乎对此只字未提:[n3092-23.3.6.2]voidswap(vector&x);Effects:Exchangesthecontentsandcapacity()of*thiswiththa

c++ - std::vector::swap 是否使迭代器无效?

如果我交换两个vector,它们的迭代器会保持有效,现在只是指向“其他”容器,还是迭代器会失效?也就是说,给定:usingnamespacestd;vectorx(42,42);vectory;vector::iteratora=x.begin();vector::iteratorb=x.end();x.swap(y);//aandbstillvalid?Pointingtoxory?std似乎对此只字未提:[n3092-23.3.6.2]voidswap(vector&x);Effects:Exchangesthecontentsandcapacity()of*thiswiththa

c++ - 可以定义一个完全通用的 swap() 函数吗?

以下片段:#include#includenamespacefoo{templatevoidswap(T&a,T&b){Ttmp=std::move(a);a=std::move(b);b=std::move(tmp);}structbar{};}voidbaz(){std::unique_ptrptr;ptr.reset();}不为我编译:$g++-std=c++11-cfoo.cppInfileincludedfrom/usr/include/c++/5.3.0/memory:81:0,fromfoo.cpp:1:/usr/include/c++/5.3.0/bits/unique