4

私は持っている

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

そして、保持と保持をemplace_back持つ要素が必要です。このコンパイルを取得できる唯一の方法は、かなり不器用なものを使用することでしたpair::first{i,j,k}pair::secondq

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>forでさえ、 std::initializer_list<U>for anyを取るコンストラクタはありません。このようなコンストラクターが存在するため、ブレース初期化リストから初期化できるという事実を誤解しないでください。UU = T

代わりに、実際に配列を作成します。

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

効率についての保証はほとんどなく、タプル アプローチよりも効率的であるとは限りません。実際には、大きな違いはないはずです。実装によって、両方の形式がemplace_back同じマシン コードに最適化されることが期待されます。あなたが本当に気にかけ、それを疑うなら、それを測定してください。

于 2015-06-01T08:29:00.737 に答える