问题标签 [emplace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在使用 emplace_hint 时判断是否添加了一个项目
由于emplace_hint
set/map 的方法只返回一个迭代器来确定是否实际添加了 item 不如使用emplace
or时方便insert
。现在我只是在之前/之后获取容器大小并比较它们:
它可以被包装成一个辅助返回对,但也许有一个现有的更简单的方法?
c++ - 如何在 std::map 中尝试放置 POD 结构?
我有一张int -> { basic types }
我需要存储的地图。
我想简单地创建一个并直接存储值,在存储期间就地struct { int f1, int f2; };
构造结构。我不希望有任何重复的键,所以看起来很理想。try_emplace
我写了这段代码:
但是这些选项都不起作用。
使用 clang++ 我得到这样的错误。(版本:clang 5.0.1 版(tags/RELEASE_501/final))
使用 g++ 我得到这样的错误。(版本:g++(MacPorts gcc7 7.2.0_0)7.2.0):
那么,我怎样才能有效地将数据存储到我的地图中(理想情况下,使用简单易读的代码)?
c++ - 为 std::vector 调用 emplace() 方法
给定以下模板声明,调用emplace()
for 方法的正确方法是什么?要求是在构造类模板对象之后,在给定位置std::vector
的向量内放置一个元素。impl_tree
tree
(注意只转载了相关源代码)
c++ - 多个 emplace_back 额外调用复制构造函数
考虑下面的例子:
运营商/p:
当只有一个元素是 时emplaced_back
,constructor/destructor pair
只调用一次。但是当有多个emplace_back
(like s.emplace_back(6);
) 时,copy constructor
也会调用 the 。为什么这种行为差异?emplace_back 是否仍然存在副本?
c++ - 为什么 unordered_map 的 emplace with piecewise_construct 参数需要默认构造函数?
我有一个unordered_map
存储<string, A>
对。我想用这个片段放置对:
但是,如果我的A
类没有默认构造函数,则它无法编译并出现以下错误:
'A::A': 没有合适的默认构造函数可用
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\tuple 1180
为什么它需要一个默认构造函数,我怎样才能避免使用它?
c++ - 使用 emplace_back 避免移动构造函数调用的最佳方法?
我刚刚了解了 C++17 中的保证复制省略。根据该问题的答案:
当你这样做时
return T();
,这将通过 a 初始化函数的返回值prvalue
。由于该函数返回 T,因此不会创建临时函数;的初始化prvalue
简单直接初始化返回值。要理解的是,由于返回值是 a
prvalue
,它还不是一个对象。它只是一个对象的初始化器,就像T()
is 一样。
所以我想知道,这是否适用于:
所以我写了这段代码emplace_back
来测试它:
这是我得到的输出(禁用复制省略):
似乎移动构造函数仍然被调用,即使 aprvalue
被直接传递给emplace_back
,我认为它可以用来直接构造一个对象,而不是用来构造一个临时的然后移动它。
有没有更优雅的方法来避免移动构造函数调用,emplace_back
而不是像函数一样做一些事情g()
?
c++11 - C++11 - 将变量放置到任何标准容器(向量、列表、集合、unordered_set)
尝试编写通用代码以将默认构造的对象放置到 std 容器中并向其返回迭代器。
插入解决方案是
但是 emplace 没有这样的通用接口,所以我不得不将它专门用于 2 种容器类型。我最好的尝试(没有编译)是:
这导致:error: void value not ignored as it ought to be
而且我不明白为什么我的 decltype 被推断为无效。
使用 gcc 4.8.5 和 -std=c++11
编辑:
转载者
int main() { std::vector v; std::vector::iterator iv = emplace(v);
}
编辑2:
第二次尝试
适用于 verctor,但 set 不明确。
gcc - 在容器上创建可变参数模板对象不起作用
下面是一个例子(不是整个班级,只是相关部分)
说我有以下
然后以下调用正常工作
但是以下会产生编译时错误
错误:
我不确定为什么模板不能使用这种模式,也不确定如何修复它,以便它可以按照我想要的方式工作,基于我看到的使用 std emplace 函数的示例,这应该能够工作。
编辑:基于没有初始化列表的版本可以正常工作的事实,我可以得出结论,问题是由于初始化列表。但是我不明白为什么这会是一个问题,这不应该能够基于调用 B 的 B 的构造函数构造适当的类型吗?
c++ - std::map::emplace 无法解析,但插入右值有效——为什么?
考虑以下尝试vector
在 a 中用数字键放置一个空map
:
调用emplace
未能解决:
尝试对向量的向量做同样的事情按预期工作(编辑:不使用时emplace_back
,参见 Bo Persson 的回答):
我对背后逻辑的粗略理解emplace
是调用emplace
和insert
应该给出相同的结果,不同之处在于 emplace 既不需要移动也不需要复制。对于这些类型,使用版本并没有太大的危害insert
,因为向量的内容会被移动(在这种特定情况下,向量无论如何都是空的)。但总的来说,为什么这会失败std::map::emplace
?使用 GCC 8.1。
c++ - return 语句中的“表达式不能用作函数”
代码(也是 截图):
如屏幕截图所示,错误发生在“ .second()
”的最后一个括号中。
vertices
是 type std::map<T, std::set<T>>
,emplace()
应该返回 apair<iterator,bool>
, bool 可以通过 访问second()
,因此返回它。不同版本的代码(例如,用变量捕获一对foo
并返回foo.second()
)没有区别;错误跟在 的最后一个括号之后second()
。
查看与此错误有关的其他问题,它们似乎归结为缺少某处的运算符,但这里似乎并非如此。为什么会这样?