我正在移植一些我现在写的使用std库容器的旧手卷处理类。我无法移植的一种方法就是我称之为“ChangeRecordOrder”,因为缺少更好的术语。我需要一个标准的库替换。如何将std :: vector的某些元素移动到向量中的新索引?
它的定义是:
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矢量在调用之前需要排序的要求。
我找不到这个std lib算法。我以前在原始内存中工作过的算法并没有使用C++移动语义。
谢谢!
我在伪代码后面添加了一个注释,希望能够解决问题。如果没有,请告诉我,我会尽力澄清。 –
@ScottKemp这是一个相当具体的操作。你可以用一系列'std :: rotate'来实现它。 –
实际上,这可以通过一个std :: stable_partition完成。更高效的取决于所涉及的不同尺寸 – MikeMB