问题标签 [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 回答
686 浏览

c++11 - 如何在地图中插入/放置以避免创建临时对象?

我正在阅读 C++11 书籍之一的建议,以便在向容器中添加项目时更倾向于emplace避免insert创建临时对象(调用被插入对象的构造函数/析构函数)。但我有点困惑,因为有几种可能性可以将对象添加到地图,例如

还有一些底层机制在阅读这样的代码时不会立即可见 - 完美转发,隐式转换......

将项目添加到地图容器的最佳方式是什么?

0 投票
1 回答
163 浏览

c++ - priority_queue::emplace 调用 push_heap?

根据CPP Referencestd::priority_queue::emplace“有效调用”

这里的“有效”是什么意思?这是否意味着emplace与那些调用具有相同的功能,或者emplace是使用这些调用实现的(我的理解是实现留给编译器)。如果emplace真的是这样实现的,那不是效率低下吗?如果我将一个元素添加到现有堆中,则不需要堆化整个堆。

0 投票
1 回答
432 浏览

c++ - emplace_back 在向量中调用赋值运算符,但不在列表中

根据 http://www.cplusplus.com/reference/vector/vector/emplace_back/ 我知道 emplace_back 会在不调用赋值运算符的情况下就地创建对象。但是在 std::vector 的情况下,它们调用赋值运算符,而在 std::list 的情况下它们不调用赋值运算符。

我的对象不可复制。除了使用指针之外,还有其他方法可以解决这个问题。

向量中的擦除似乎也调用了赋值运算符,列表中的擦除不调用赋值运算符。这对我来说似乎不对..

std 不支持不可复制的对象吗?

0 投票
2 回答
1571 浏览

c++ - 带有可变参数模板的自定义容器 emplace

我正在实现一个简单的圆形向量类。我想实现一个 emplace 成员函数,但我收到一个我不明白的错误。对于我做错的事情,这可能是一个简单的修复,但由于我对可变参数模板没有太多经验,所以我无法弄清楚是什么......

我得到的错误是:

产生此错误的源代码是(也位于此处http://coliru.stacked-crooked.com/a/37d50d6f23363357):

0 投票
1 回答
2469 浏览

c++ - 如何在值为 std::set 的 std::map 中使用 emplace() (从某物映射到一个集合)?

问题

我有一个std::map<int, std::set<int>>名为misi. 我想知道为什么misi.emplace(2345, {6, 9});并且misi.emplace({2345, {6, 9}});不按预期工作,如下所示。

编码

上面是std::set,您可以看到初始化列表构造函数并且emplace()工作正常。

以上是std::mapto intint您可以看到这些方法也可以完美运行,除了在最后一个示例中,std::pair可能有些多余。我想知道是否std::pair是就地建造的。(好吧,我想不是)

对于 astd::map到 a std::set,初始化列表构造函数如上所示完美运行。但是emplace()没有!(如下所示)

在这里,以下语法是可以的,但并不完全符合我的要求:

所以,似乎没有办法std::pair就地创建,而且似乎std::set是就地创建的(对吧?)。有没有人有任何想法?

我正在使用的编译器是:

0 投票
1 回答
2161 浏览

dictionary - 地图::emplace,其中 V 构造函数需要两个参数

我可以为 map::emplace 找到的所有示例都使用相当简单的类型,这些类型的构造函数采用单个参数,例如

假设值类型构造函数需要两个参数。哎呀,让我们真的让它变得简单;假设值类型是std::pair<std::string, double>. 如何使用std::map<string, pair<string, double> >::emplace()在地图中就地构造值类型?

我知道这不起作用:

至少,它在 g++ 4.8.2 上大声而冗长地失败了。这甚至可以用 C++11 实现吗?

0 投票
1 回答
4080 浏览

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

我有

并且想要emplace_back一个带有pair::firstholding{i,j,k}pair::secondholding的元素q。我能得到这个编译的唯一方法是用相当笨拙的

这是否有效(即是否保证s将tuple被优化掉)?还是有另一种保证效率的方法?

(我试过了

但对 gcc 4.8.1 无济于事)。我知道我可以通过定义来避免这个问题

但我宁愿不用这样的额外代码。

0 投票
1 回答
172 浏览

c++11 - 放置到 std::vector 的实例的地址无效

我有 2std::vector秒:

  • 到第一个向量,我放置实例
  • 到第二个向量,我想存储刚刚放置的实例的地址

但它不起作用,即存储的地址与放置实例的地址不同。

如果这很重要,我在 Linux 上并使用 g++ 5.1 和 clang 3.6 和 -std=c++11。

这是一个说明问题的工作示例。

问题

  • 这是正确的行为吗?我猜这是由存储临时实例的地址引起的,但我想知道标准是否允许(只是好奇)。
  • 如果上述情况属实,如何解决这个问题?我通过将第一个更改为解决了这个问题,vector<unique_ptr<Foo>>但是有什么惯用的方法吗?
0 投票
4 回答
2956 浏览

c++ - 在 unordered_map 中放置 unordered_set

如何将(静态定义的)unordered_set 添加到 unordered_map,而不必复制 unordered_set?

我试过这个:

和这个:

但它们都没有编译,我得到这些错误(分别):

0 投票
1 回答
375 浏览

boost - 为什么 boost::lockfree::spsc_queue 没有 emplace?

常规std::vector具有emplace_back避免不必要的副本。有理由spsc_queue不支持吗?emplace由于某种原因,是否不可能使用无锁队列?