如何有效地 emplace_back(pair)?

how to emplace_back(pair) efficiently?

我有

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

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

(我试过了

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

但对 gcc 4.8.1 无效)。我知道我可以通过定义

来避免这个问题
struct element : std::pair<std::array<int,3>,int>
{
  element(int i, int j, int k, int q)
  { first={i,j,k}; second=q; }
};

vector<element> foo;
foo.emplace_back(i,j,k,q);

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

std::array<T, N> 没有任何构造函数为任何 U 采用 std::initializer_list<U>,甚至 U = T 也没有。不要错误地认为它可以从花括号初始化列表中初始化,因为存在这样一个构造函数。

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

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

效率几乎没有任何保证,并且不能保证这比您的元组方法更有效。实际上,它应该不会有太大区别,我希望实现将 emplace_back 的两种形式优化为相同的机器代码。如果你真的很在乎,并且你对此表示怀疑,请衡量一下。