在c ++中交换两个向量之间不同长度的序列

Jac*_*ova 3 c++ swap stl vector range

假设您有两个整数向量:

在此输入图像描述

在此输入图像描述

我想定义一个函数,它允许我在两个向量之间交换一系列元素,将两个序列的起始索引和长度作为参数传递.

例如: 在此输入图像描述 哪里 在此输入图像描述在此输入图像描述 是向量和作为参数传递的数字表示序列的起始索引和长度.

在这种情况下,我应该获得autput

V1 = 1,2, 13,14,15 ,5,6,7,8,9

V2 = 10,11,12, 3,4 ,16,17,18

我定义的一个例子的函数签名不是约束,如果你认为有更好的方法可以

Tem*_*Rex 6

似乎所有常规STL算法都达不到您想要的精确度:

std::swap_ranges几乎就在那里,但它要求你交换相同的长距离 std::rotate也不会坏,但它要求一个范围的终点等于第二个范围的起点.

// pseudo-splice on vector
v1.insert(v1.begin() + 2 + 2, v2.begin() + 3, v2.begin() + 3 + 3);
v2.erase(v2.begin() + 3, v2.begin() + 3 + 3);

// pseudo-splice on vector
v2.insert(v2.begin() + 3, v1.begin() + 2, v1.begin() + 2 + 2);
v1.erase(v1.begin() + 2, v1.begin() + 2 + 2);
Run Code Online (Sandbox Code Playgroud)

您当然可以轻松地将其抽象为一个函数模板,该模板为您的两个范围采用任意迭代器边界.

根据David的评论进行编辑,您可以进行一些优化以避免不必要的大小调整

// compute smallest range here, in this case it's the v1 part
std::swap_ranges(v1.begin() + 2, v1.begin() + 2 + 2, v2.begin() + 3);

// now handle the remaining part of the longest range, in this case it's element v2 + 3 + 2
std::insert(v1.begin() + 2 + 2, v2.begin() + 3 + 2);
std::erase(v2.begin() + 3 + 2);
Run Code Online (Sandbox Code Playgroud)

更新:std::list从那时起你可以使用它会更容易splice(我重新排列insert/ erase部分来模仿下面的代码)

v1.splice(v1.begin() + 2 + 2, v2, v2.begin() + 3, v2.begin() + 3 + 3);
v2.splice(v2.begin() + 3, v1, v1.begin() + 2, v1.begin() + 2 + 2);
Run Code Online (Sandbox Code Playgroud)