[英]How to efficiently insert a pair in std::vector?
我有一个std::vector<std::pair<...>>
并希望有效地修改它们:
vector<pair<int, int>> vec;
vec.emplace_back(4, 5);
vec.emplace_back(6, 7);
// Now I want to set the first pair in the vector.
vec[0] = make_pair(10, 10);
据我了解,我们有
make_pair
构造。 这需要 2 个int
副本。pair<int,int>& operator=( pair<int,int>&& other )
被调用,它在pair
中的两个int
上调用std::move
。 这需要 2 个int
副本。结果我们4份ints!
但是在Vector
修改一pair
应该需要 2 个int
副本。 emplace_back
似乎是我需要的,但它只在向量的末尾进行就地构造,而不是在任何其他索引处。
我肯定能做到
vec[0].first = 10;
vec[0].second = 10;
但这考虑到了 pair 的内部结构,我想省略它。
如何更有效地编写代码(没有int
的冗余副本)?
启用编译器优化,瞧,它们完全一样: https : //godbolt.org/z/Nwb_y0
GCC 8 生成的程序集是:
mov rax, QWORD PTR [rdi]
mov DWORD PTR [rax], esi
mov DWORD PTR [rax+4], edx
如您所见,整数只存储一次,没有额外的副本。
如果使用-O1
而不是-O2
或-O3
编译,对于没有make_pair
的“更简单”版本,代码实际上更糟:它从向量中加载地址两次。 所以make_pair
版本是更好-O1
在更高级别的优化和相同的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.