草庐IT

c++ - 为什么 emplace_back() 会这样?

为什么在调用emplace_back()后立即调用~Base()为什么在析构函数调用后可以访问sayHello()为什么再次调用~Base()#include#includeclassBase{private:staticintm_count;public:Base(){std::coutvBase;vBase.emplace_back(Base());//程序输出...Basecreated.Count=1Basedestroyed.Count=0BasesayshelloBasedestroyed.Count=-1 最佳答案 在

c++ - 什么时候使用 std::unordered_map::emplace_hint?

我知道如何使用std::unordered_map::emplace,但如何使用emplace_hint?都不是cplusplus也不cppreference提供一组示例来说明我们如何知道将元素放在哪里。任何人都可以提供一些这方面的信息或提供一些示例/说明,说明我们什么时候可以知道放置的元素应该放在哪里吗? 最佳答案 unordered_map可以做什么可能与提示有关吗?好吧,如果迭代器使用与emplace_hint的元素相同的键来寻址一个元素。已被要求插入,然后它可能会很快失败-只是一个键比较,没有任何散列或在该桶中的任何散列冲突

c++ - C++17 和 emplace_back(...) 中的保证复制省略

emplace_back(...)是在C++11中引入的,以防止创建临时对象。现在使用C++17,纯左值甚至更纯,因此它们不会再导致临时对象的创建(更多信息请参见thisquestion)。现在我仍然不完全理解这些变化的后果,我们是否还需要emplace_back(...)还是我们可以回去使用push_back(...)又是? 最佳答案 push_back和emplace_back成员函数都在其value_typeT的某个位置创建了一个新对象预分配缓冲区。这是由vector的分配器完成的,默认情况下,它使用placementnew机

c++ - 如何有效地 emplace_back(pair)?

我有usingnamespacestd;//forconvenienceinSOquestiononlyvector,int>>foo;并且想要emplace_back一个元素,其中pair::first持有{i,j,k}和pair::second持有q。我能得到这个编译的唯一方法是使用相当笨拙的foo.emplace_back(piecewise_construct,forward_as_tuple(i,j,k),forward_as_tuple(q));这是否有效(即保证tuple将被优化掉)?或者还有其他保证有效的方法吗?(我试过了foo.emplace_back(std::in

c++ - 为什么在此示例中必须使用 emplace_back move ?

以下最小工作示例在使用选项1或选项2下的代码时编译,但在使用选项3下的代码时不编译。我假设emplace_back()隐式使用/调用move构造函数,那么为什么需要显式move()呢?它与r-value和l-value有关系吗?或者这是否与需要转让所有权的std::unique_ptr有关?(我对这些概念还是陌生的,尤其是在这种情况下。)为了完整性,带有push_back()的选项4也不会编译,除非调用move()。#include#include#includeclassBeta{public:Beta(intx,inty,intz):mX(x),mY(y),mZ(z){};intm

c++ - 在这种情况下, std::stack::push() 和 std::stack::emplace() 之间有区别吗?

看这段代码:structDummy{intbla;intblabla;charcharacter;Dummy(intb,intbb,charc):bla(b),blabla(bb),character(c){}};std::stacks;Dummydummy;s.push(dummy);//(1)s.emplace(dummy);//(2)我看不出(1)和(2)之间的区别。我知道emplace()在为要添加的对象的构造函数提供参数时很有用,例如:s.emplace(1,2,'c');但我不知道我描述的情况有什么区别,因为push()和emplace()都应该引用本地dummy对象并使用

c++ - 使用 MinGW-W64 的 LTO 导致 DLL 链接失败

我未能使用带-flto的MinGW-W64为Windowsx86-64构建共享库。这是我得到的(编译是在Linux机器上完成的):#...x86_64-w64-mingw32-g++-c-std=gnu++11-fvisibility=hidden-DGLEW_STATIC-Ofast-flto-frtti-pedantic-Wall-Wextra-fexceptions-mthreads-DUNICODE-DQT_LARGEFILE_SUPPORT-I.-I'include'-I'/usr/x86_64-w64-mingw32/share/qt4/mkspecs/win32-g++-

c++ - 你怎么能 emplace_back 错误的类型呢?

我有一个doublevector。但是我打错了我打算这样写:std::vectortimestamp;但我是这样写的:std::vector>timestamp;但是,这样编译timestamp.emplace_back(a_double_timestamp)我正在安置一个double进入std::vector>.double不是std::vector 最佳答案 double隐式转换为size_type,作为thevectorconstructor的参数:explicitvector(size_typecount);因此,如果你通过

c++ - 在 C++11 中从 C++17 重新实现 std::map::try_emplace()?

std::map::try_emplace()看起来非常方便和高效,但它仅在C++17中可用。是否可以在C++11中重新实现它?templatepairtry_emplace(constkey_type&k,Args&&...args); 最佳答案 对于有序映射,您可以使用lower_bound接近行为:templatestd::pairtry_emplace_m(M&m,consttypenameM::key_type&k,Args&&...args){autoit=m.lower_bound(k);if(it==m.end()|

c++ - emplace_back 调用移动构造函数和析构函数

我尝试将类cBar的两个实例放置到具有emplace_back函数的vector中。根据reference调用emplace_back仅保留vector中的位置,然后“就地”创建新实例。现在,我试着用它做实验:#include#include#include#includeclasscBar{public:cBar(constintindex);cBar(cBar&&other);//neededforemplace_back?~cBar();private:cBar(constcBar&other)=delete;cBar&operator=(constcBar&other)=del