似乎所有常规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)