如何有效地使用emplace_back(对)?

时间:2015-06-01 08:19:42

标签: c++ std-pair emplace

我有

-lz

并希望using namespace std; // for convenience in SO question only vector<pair<array<int,3>, 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)); s将被优化掉)?或者还有另一种保证有效的方法吗?

(我试过了

tuple

但无法使用gcc 4.8.1)。我知道我可以通过定义

来避免这个问题
foo.emplace_back(std::initializer_list<int>{i,j,k}, q);

但我宁愿没有这样的额外代码。

1 个答案:

答案 0 :(得分:3)

std::array<T, N>没有任何构造函数为std::initializer_list<U>获取U,甚至U = T也没有。不要误以为它可以从braced-init-list初始化,以确定是否存在这样的构造函数。

相反,实际上是创建一个数组。

foo.emplace_back(std::array<int,3>{i,j,k}, q);

几乎没有任何关于效率的保证,这并不能保证比你的元组方法更有效。在实践中,它不应该产生太大的影响,我希望实现能够将emplace_back的两种形式优化为相同的机器代码。如果你真的关心,而你怀疑,那么就衡量它。