我有一个 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
s. - 下一个
pair<int,int>& operator=( pair<int,int>&& other )
被称为调用std::move
在两个int
在pair
中.这需要 2 个拷贝int
s.
结果我们得到了 4 个整数拷贝!
但是修改了一个pair
在Vector
应该拿 2 份 int
秒。 emplace_back
似乎是我需要的,但它只在 vector 的末尾进行就地构造,而不是在任何其他索引处。
当然可以
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
:它从 vector 中加载地址两次。所以 make_pair
版本在 -O1
上更好,在更高的优化级别上相同。
关于c++ - 如何有效地在 std::vector 中插入一对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52900899/