我有
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>
没有任何构造函数采用 std::initializer_list<U>
对于任何 U
, 甚至不是 U = T
.不要因为存在这样的构造函数而误认为它可以从花括号初始化列表中初始化。
相反,实际上创建一个数组。
foo.emplace_back(std::array<int,3>{i,j,k}, q);
关于效率几乎没有任何保证,并且不能保证这比您的元组方法更有效。在实践中,它应该没有太大区别,我希望实现能够优化 emplace_back
的两种形式。到相同的机器码。如果您真的关心并且对此表示怀疑,请衡量一下。
关于c++ - 如何有效地 emplace_back(pair)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30568734/