如何有效地安置回(对)

how to emplace_back(pair) efficiently?

本文关键字:有效地      更新时间:2023-10-16

我有

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>没有任何构造函数为任何Ustd::initializer_list<U>,甚至U = T也没有。不要误以为可以通过带括号的init-list初始化它,就表示存在这样的构造函数。

实际上是创建一个数组。

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

几乎没有任何关于效率的保证,并且不能保证这比您的元组方法更有效。在实践中,它不应该有太大的区别,我希望实现将两种形式的emplace_back优化到相同的机器码。