gpt4 book ai didi

c++ - 如何将 std::vector 的某些元素移动到 vector 中的新索引?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:53:05 31 4
gpt4 key购买 nike

我正在移植我编写的一些旧的手工数组处理类,现在使用 std 库容器。我在移植时遇到问题的一种方法是我称之为“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)处的元素已移动到原始 vector 的索引 6(在 60 之前)。

当然,我想就地执行此操作,而不是使用另一个临时 vector 。我也不介意在调用之前需要对 IndexesToMove vector 进行排序的要求。

我找不到为此的标准库算法。我之前在原始内存上使用的算法没有使用 c++ 移动语义。

谢谢!

最佳答案

template <typename t> void move(std::vector<t>& v, size_t oldIndex, size_t newIndex)
{
if (oldIndex > newIndex)
std::rotate(v.rend() - oldIndex - 1, v.rend() - oldIndex, v.rend() - newIndex);
else
std::rotate(v.begin() + oldIndex, v.begin() + oldIndex + 1, v.begin() + newIndex + 1);
}

测试:https://coliru.stacked-crooked.com/a/5c31007000b9eeba

int main()
{
std::vector<int> v{ 3, 4, 5, 6, 7, 8, 9 };

move(v, 1, 4);
move(v, 4, 1);
move(v, 3, 3);
}

输出:

move 1 to 4:  3   [4]   5    6    7    8    9  
result: 3 5 6 7 [4] 8 9

move 4 to 1: 3 5 6 7 [4] 8 9
result: 3 [4] 5 6 7 8 9

move 3 to 3: 3 4 5 [6] 7 8 9
result: 3 4 5 [6] 7 8 9

关于c++ - 如何将 std::vector 的某些元素移动到 vector 中的新索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447361/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com