问题标签 [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.

0 投票
1 回答
74 浏览

c++ - 在使用 emplace_hint 时判断是否添加了一个项目

由于emplace_hintset/map 的方法只返回一个迭代器来确定是否实际添加了 item 不如使用emplaceor时方便insert。现在我只是在之前/之后获取容器大小并比较它们:

它可以被包装成一个辅助返回对,但也许有一个现有的更简单的方法?

0 投票
1 回答
2191 浏览

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):

那么,我怎样才能有效地将数据存储到我的地图中(理想情况下,使用简单易读的代码)?

0 投票
0 回答
59 浏览

c++ - 为 std::vector 调用 emplace() 方法

给定以下模板声明,调用emplace()for 方法的正确方法是什么?要求是在构造类模板对象之后,在给定位置std::vector的向量内放置一个元素。impl_treetree

(注意只转载了相关源代码)

0 投票
2 回答
226 浏览

c++ - 多个 emplace_back 额外调用复制构造函数

考虑下面的例子:

运营商/p:

当只有一个元素是 时emplaced_backconstructor/destructor pair只调用一次。但是当有多个emplace_back(like s.emplace_back(6);) 时,copy constructor也会调用 the 。为什么这种行为差异?emplace_back 是否仍然存在副本?

0 投票
1 回答
1096 浏览

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

为什么它需要一个默认构造函数,我怎样才能避免使用它?

0 投票
1 回答
1526 浏览

c++ - 使用 emplace_back 避免移动构造函数调用的最佳方法?

我刚刚了解了 C++17 中的保证复制省略。根据该问题的答案:

当你这样做时return T();,这将通过 a 初始化函数的返回值prvalue。由于该函数返回 T,因此不会创建临时函数;的初始化prvalue简单直接初始化返回值。

要理解的是,由于返回值是 a prvalue,它还不是一个对象。它只是一个对象的初始化器,就像T()is 一样。

所以我想知道,这是否适用于:

所以我写了这段代码emplace_back来测试它:

这是我得到的输出(禁用复制省略):

似乎移动构造函数仍然被调用,即使 aprvalue被直接传递给emplace_back,我认为它可以用来直接构造一个对象,而不是用来构造一个临时的然后移动它。

有没有更优雅的方法来避免移动构造函数调用,emplace_back而不是像函数一样做一些事情g()

0 投票
2 回答
305 浏览

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 不明确。

0 投票
0 回答
27 浏览

gcc - 在容器上创建可变参数模板对象不起作用

下面是一个例子(不是整个班级,只是相关部分)

说我有以下

然后以下调用正常工作

但是以下会产生编译时错误

错误:

我不确定为什么模板不能使用这种模式,也不确定如何修复它,以便它可以按照我想要的方式工作,基于我看到的使用 std emplace 函数的示例,这应该能够工作。

编辑:基于没有初始化列表的版本可以正常工作的事实,我可以得出结论,问题是由于初始化列表。但是我不明白为什么这会是一个问题,这不应该能够基于调用 B 的 B 的构造函数构造适当的类型吗?

0 投票
3 回答
354 浏览

c++ - std::map::emplace 无法解析,但插入右值有效——为什么?

考虑以下尝试vector在 a 中用数字键放置一个空map

调用emplace未能解决:

尝试对向量的向量做同样的事情按预期工作(编辑:不使用时emplace_back,参见 Bo Persson 的回答):

我对背后逻辑的粗略理解emplace是调用emplaceinsert应该给出相同的结果,不同之处在于 emplace 既不需要移动也不需要复制。对于这些类型,使用版本并没有太大的危害insert,因为向量的内容会被移动(在这种特定情况下,向量无论如何都是空的)。但总的来说,为什么这会失败std::map::emplace?使用 GCC 8.1。

0 投票
1 回答
714 浏览

c++ - return 语句中的“表达式不能用作函数”

代码(也是 截图):

如屏幕截图所示,错误发生在“ .second()”的最后一个括号中。

vertices是 type std::map<T, std::set<T>>emplace() 应该返回 apair<iterator,bool>, bool 可以通过 访问second(),因此返回它。不同版本的代码(例如,用变量捕获一对foo并返回foo.second())没有区别;错误跟在 的最后一个括号之后second()

查看与此错误有关的其他问题,它们似乎归结为缺少某处的运算符,但这里似乎并非如此。为什么会这样?