c++ - 如何有效地在 std::vector 中插入一对?

标签 c++ int std move stdvector

我有一个 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);

据我了解

  1. 临时对由make_pair构建.这需要 2 个拷贝 int s.
  2. 下一个 pair<int,int>& operator=( pair<int,int>&& other )被称为调用 std::move在两个 intpair 中.这需要 2 个拷贝 int s.

结果我们得到了 4 个整数拷贝!

但是修改了一个pairVector应该拿 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/

相关文章:

c++ - 将字符串中的数据提取到映射中的有效方法是什么?

c++ - #define 更改为 constexpr auto

android - 进度条随 int 值变化

c++ - std::vector<bool> - 特化中没有 data() 函数?

C++ std::string 到数字模板

c++ - 在 C++ 中的对角线上绘制圆圈

c++ - 使用 C++ 在结构中初始化列表容器对象?

mysql - 为什么 INT(11) 只存储 10 位数字?

c - 基本 C 帮助使用数组和 for 循环

c++ - 如何确保 std::random_shuffle 总是产生不同的结果?