【发布时间】:2018-01-08 21:12:29
【问题描述】:
我正在移植一些我写的旧的手卷数组处理类,现在使用标准库容器。我在移植时遇到问题的一种方法是我称之为“ChangeRecordOrder”的方法,因为没有更好的术语。我需要一个标准库替换。
它的定义是:
template <class T>
void ChangeRecordOrder( std::vector<T> IN OUT &inputVector,
uint newInsertIndex,
std::vector<uint> IN const &indexesToMoveToNewIndex );
例如(伪代码):
MyVector<uint> = {0,10,20,30,40,50,60,70,80,90}
IndexesToMove = {2,4}
NewIndex = 6
After call to ChangeRecordOrder( MyVector, NewIndex, IndexesToMove ):
MyVector<uint> == {0,10,30,50,20,40,60,70,80,90}
请注意,2 和 4(20 和 40)处的元素被移动到原始向量的索引 6(在 60 之前)。
当然我想在原地做这个,而不是使用另一个临时向量。我也不介意在调用之前需要对 IndexesToMove 向量进行排序的要求。
我找不到用于此的标准库算法。我之前在原始内存上使用的算法并没有使用 c++ 移动语义。
谢谢!
【问题讨论】:
-
我在伪代码之后添加了一条注释,希望可以解决问题。如果不是,请告诉我,我会尽力澄清。
-
@ScottKemp 这是一个非常具体的操作。你可以通过一系列
std::rotate来实现它。 -
实际上,这可以通过单个 std::stable_partition 来完成。哪个更有效取决于所涉及的不同尺寸
-
@MooingDuck:就地?怎么样?
-
@ScottKemp:“请注意,2 和 4(20 和 40)处的元素已移至原始向量的索引 6”它们似乎位于索引 5。
标签: c++ algorithm sorting standard-library