我编写了一个简单的程序来尝试在标准库容器中就地创建对象。这是我写的:#include#includeclassAB{public:explicitAB(intn);AB(constAB&other)=delete;AB(AB&&other);AB&operator=(constAB&other)=delete;AB&operator=(AB&&other)=default;private:inti;};AB::AB(intn):i(n){std::coutv;v.emplace_back(1);v.emplace_back(2);v.emplace_back(3);};我用g++(4.
是否保证std::vector仅在size()==capacity()并调用push_back()时移动其数据或emplace_back()或者它也可以这样做吗? 最佳答案 规范有点间接。容量指定为:size_typecapacity()constnoexcept;Returns:Thetotalnumberofelementsthatthevectorcanholdwithoutrequiringreallocation.第二部分来自reserve:reserve(size_typen);Remarks:Reallocationi
是否保证std::vector仅在size()==capacity()并调用push_back()时移动其数据或emplace_back()或者它也可以这样做吗? 最佳答案 规范有点间接。容量指定为:size_typecapacity()constnoexcept;Returns:Thetotalnumberofelementsthatthevectorcanholdwithoutrequiringreallocation.第二部分来自reserve:reserve(size_typen);Remarks:Reallocationi
在C++17中,std::map和std::unordered_map得到一个新的成员函数模板:try_emplace().这个新增内容,在n4279中提出,行为类似于emplace(),但具有以下优点:如果插入没有发生,try_emplace()不会从右值参数移动。这在操作其值为仅移动类型的map时很有用,例如std::unique_ptr.try_emplace()分别处理mapped_type的键和参数,这使得它比用value_type表示的通用mutators更直观(即std::pair)。鉴于上述优点,你会不会在编写C++1z时使用C++11中的emplace()而不是C++
在C++17中,std::map和std::unordered_map得到一个新的成员函数模板:try_emplace().这个新增内容,在n4279中提出,行为类似于emplace(),但具有以下优点:如果插入没有发生,try_emplace()不会从右值参数移动。这在操作其值为仅移动类型的map时很有用,例如std::unique_ptr.try_emplace()分别处理mapped_type的键和参数,这使得它比用value_type表示的通用mutators更直观(即std::pair)。鉴于上述优点,你会不会在编写C++1z时使用C++11中的emplace()而不是C++
我认为emplace_back会是赢家,当做这样的事情时:v.push_back(myClass(arg1,arg2));因为emplace_back会立即在vector中构造对象,而push_back会先构造一个匿名对象,然后将其复制到vector中。更多信息见this问题。Google还提供this和this问题。我决定将它们比较为一个将由整数填充的vector。这里是实验代码:#include#include#include#include#includeusingnamespacestd;usingnamespacestd::chrono;intmain(){vectorv1;
我认为emplace_back会是赢家,当做这样的事情时:v.push_back(myClass(arg1,arg2));因为emplace_back会立即在vector中构造对象,而push_back会先构造一个匿名对象,然后将其复制到vector中。更多信息见this问题。Google还提供this和this问题。我决定将它们比较为一个将由整数填充的vector。这里是实验代码:#include#include#include#include#includeusingnamespacestd;usingnamespacestd::chrono;intmain(){vectorv1;
以下代码:#includestructS{intx,y;};intmain(){std::vectorv;v.emplace_back(0,0);}使用GCC编译时出现以下错误:Infileincludedfromc++/4.7.0/i686-pc-linux-gnu/bits/c++allocator.h:34:0,fromc++/4.7.0/bits/allocator.h:48,fromc++/4.7.0/vector:62,fromtest.cpp:1:c++/4.7.0/ext/new_allocator.h:Ininstantiationof'void__gnu_cxx::
以下代码:#includestructS{intx,y;};intmain(){std::vectorv;v.emplace_back(0,0);}使用GCC编译时出现以下错误:Infileincludedfromc++/4.7.0/i686-pc-linux-gnu/bits/c++allocator.h:34:0,fromc++/4.7.0/bits/allocator.h:48,fromc++/4.7.0/vector:62,fromtest.cpp:1:c++/4.7.0/ext/new_allocator.h:Ininstantiationof'void__gnu_cxx::
C++11vector具有新函数emplace_back。与push_back不同,它依赖于编译器优化来避免复制,emplace_back使用完美转发将参数直接发送到构造函数以就地创建对象。在我看来,emplace_back做了所有push_back可以做的事情,但有时它会做得更好(但绝不会更糟)。我必须使用push_back的原因是什么? 最佳答案 在过去的四年里,我对这个问题思考了很多。我得出的结论是,大多数关于push_back与emplace_back的解释都忽略了全貌。去年,我在C++Now的TypeDeductionin