c++ - 如何有效地 emplace_back(pair)?

标签 c++ std-pair emplace

我有

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/

相关文章:

c++ - 一条指令中的 new、() 和 [] 运算符

c++ - 从 std::vector 删除范围 vector 的最佳方法

c++ - 这段内存会被正确释放吗?

c++ - 如何最好地将 emplace 与 std::map 一起使用

c++ - 有没有办法放置返回值?

c++ - 为什么将 emplace_back 与已删除的复制构造函数一起使用不起作用?

C++:使用递归在列表中查找 int - 何时返回

c++ - 所有的 GUI 框架都使用 Windows API 吗?

c++ - QMutexLocker 和 QMutex 哪个更好用?

c++ - 对值读取错误 C++