【发布时间】:2018-10-19 22:59:59
【问题描述】:
我有一个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 份ints。 - 接下来调用
pair<int,int>& operator=( pair<int,int>&& other ),它在pair中的两个ints 上调用std::move。这需要 2 份ints。
因此我们有 4 个整数副本!
但是在Vector 中修改pair 应该需要ints 的2 个副本。 emplace_back 似乎是我需要的,但它只在向量的末尾进行就地构造,而不是在任何其他索引处。
当然可以
vec[0].first = 10;
vec[0].second = 10;
但这考虑了pair的内部结构,我想省略。
如何更有效地编写代码(没有ints 的冗余副本)?
【问题讨论】:
-
一对整数的移动将与一对整数的副本具有相同的性能。 FWIW。
-
除非你能衡量一个问题,否则我不会担心几个整数。这是在一个巨大的循环中吗?
-
仅供参考,
std::pair有一个将两个值作为输入的构造函数,因此您可以在调用emplace_back()时省略make_pair():vec.emplace_back(4, 5); -
我想这段代码在性能关键循环中工作。 emplace_back 在末尾添加了一个元素,但是我需要在中间修改一个元素。
标签: c++ int std move stdvector