如何有效地 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
的两种形式优化为相同的机器代码。如果你真的很在乎,并且你对此表示怀疑,请衡量一下。
我有
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
的两种形式优化为相同的机器代码。如果你真的很在乎,并且你对此表示怀疑,请衡量一下。