【发布时间】:2020-04-01 16:26:12
【问题描述】:
我有一个 std::vector 元素,想将一个元素移动到指定位置。 我已经有了解决方案,但我很想知道是否有更好的方法。
假设我想将最后一个元素移动到索引位置;
我可以做一个
auto posToInsert = vecElements.begin();
std::advance(posToInsert, pos);
vecElements.insert(posToInsert, *m_vecRows.rbegin());
vecElements.erase(m_vecRows.rbegin());
但这会重新分配内存。
可惜了
std::move(vecElements.rbegin(), vecElements.rbegin(), posToInsert);
没用。
我当前的解决方案做了一些交换,但没有新的内存分配
auto newElement = vecElements.rbegin();
for (auto currentPos = vecElements.size()-1; currentPos != pos; --currentPos)
newElement->swap(*(newElement + 1)); // reverseIterator +1 = element before
澄清一下,因为@NathanOliver 要求...应该保留向量的剩余顺序。
有没有更好的方法?
【问题讨论】:
-
您是否关心您要移动到的位置的元素?如果没有,只需交换它们
-
在文本中添加了一个说明......其他元素的顺序应该保持不变。
-
尝试 -- 获取源位置的值,擦除源位置的元素,然后在目标位置插入该值。
-
但这会重新分配内存 -- 我们要处理多少个元素?发生重新分配的问题是什么?通常,向量实施一种策略,其中重新分配的次数被最小化。并不是每次添加元素时都会进行重新分配。
标签: c++ vector move stdvector swap