4

我有

using namespace std;   // for convenience in SO question only
vector<pair<array<int,3>, int>> foo;

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

foo.emplace_back(piecewise_construct,
                 forward_as_tuple(i,j,k),
                 forward_as_tuple(q));

这是否有效(即是否保证s将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);

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

4

1 回答 1

4

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

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

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

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

于 2015-06-01T08:29:00.737 回答